Diretório do artigo
1 aula abstrata
1.1 Por que existem classes abstratas
Ao executar a análise orientada a objetos, haverá alguns conceitos abstratos.Como mostrado na figura abaixo, a classe retangular e a classe circular são subclasses da classe shape e todas elas têm uma função para encontrar a área. No entanto, faz sentido encontrar a área de uma forma específica e não faz sentido encontrar a área do "gráfico" conceitual!
Os gráficos são apenas um tipo conceitual, não há objeto específico. No entanto, ainda há necessidade de gráficos.
A classe de gráficos aqui deve ser projetada como uma classe abstrata, usada para representar conceitos abstratos no mundo real.Não existem objetos específicos e as funções relacionadas não são totalmente implementadas, portanto, elas só podem ser herdadas e reescritas.
1.2 Classes abstratas e funções virtuais puras
Nós aprendemos funções virtuais no passado e elas são implementadas por meio da palavra-chave virtual. Sem fornecer a realização do corpo da função, diretamente "= 0" é uma função virtual pura
As regras de sintaxe são as seguintes:
"= 0" informa ao compilador que atualmente está declarando uma função virtual pura, sem definir o corpo da função
Classe abstrata
- Classes com funções virtuais puras são abstratas
- Funções virtuais puras são funções membro que definem apenas protótipos, nenhuma implementação é fornecida
- Uma função virtual pura se torna uma função virtual após ser implementada
- Se a subclasse não implementar todas as funções virtuais puras, a subclasse ainda será uma classe abstrata
// 37-1.cpp
#include<iostream>
using namespace std;
class Shape
{
public:
virtual double area() = 0;
};
class Rect : public Shape
{
public:
Rect(int a, int b) : ma(a), mb(b) {}
double area()
{
return ma * mb;
}
private:
int ma;
int mb;
};
class Circle : public Shape
{
public:
Circle(int r) : mr(r) {}
double area()
{
return 3.14 * mr * mr;
}
private:
int mr;
};
void area(Shape* p)
{
double s = p->area();
cout << "area = " << s << endl;
}
int main()
{
Rect rect(1, 2);
Circle circle(10);
area(&rect);
area(&circle);
return 0;
}
Shape é uma classe abstrata e não pode gerar objetos, o que evita a geração de objetos Shape sem conhecê-los, porque os objetos Shape não têm sentido. Depois que uma função virtual pura é implementada, ela se torna uma função virtual, que implementa o polimorfismo.Um objeto de uma subclasse de ponteiro de uma classe abstrata pode chamar dinamicamente funções-membro da subclasse de acordo com o tipo de objeto para encontrar a área de uma forma específica.
$ g++ 37-1.cpp -o 37-1
$ ./37-1
area = 2
area = 314
2 Interface
Classes C ++ que atendem às seguintes condições se tornam interfaces
- Nenhuma variável é definida na classe
- Todas as funções membro são funções virtuais puras e são públicas
Implementamos uma interface da seguinte maneira:
class Channel
{
public:
virtual bool open() = 0;
virtual void close() = 0;
virtual bool send(char* buf, int len) = 0;
virtual int receive(char* buf, int len) = 0;
};
Não há variáveis de membro, apenas funções virtuais puras públicas.
3 Resumo
1. Classes abstratas são usadas para descrever conceitos abstratos no mundo real
2. Classes abstratas são implementadas por funções virtuais puras
3. Classes abstratas só podem ser herdadas e não podem criar objetos
4. Classes nas quais existem apenas funções virtuais puras são interfaces