O significado do polimorfismo : aumentando a escalabilidade do código
Como o polimorfismo é implementado : Quando o ponteiro ou referência da classe pai aponta para o endereço ou objeto da subclasse, ocorre o polimorfismo.
Pré-requisitos para acionamento:
1. A subclasse herda da classe pai
2. Existe uma função virtual (virtual) na classe pai e na subclasse A função virtual da classe pai é reescrita (a "virtua" antes da função da subclasse pode ser adicionada ou não)
A compreensão vernácula do polimorfismo : a classe pai fornece matérias-primas e modelos (recepção do restaurante) e a subclasse os processa (cozinha do restaurante). Quando um cliente chega, a função virtual reescrita na subclasse é chamada indiretamente através da classe pai (anote o nome do prato pedido pelo cliente) (vá até a cozinha para encontrar o filho) para completar as funções correspondentes de cada subclasse.
- Implementação ingênua polimórfica
class calculator
{
public:
virtual int add() {
cout << " 开业大酬宾!!(do nothing) " << endl;
}
int a;
int b;
};
class Plus : public calculator
{
public:
int add() {
cout << "家人们用我爹给我的猪肉(a)和大鹅(b)炖了两道菜:猪肉炒大葱+铁锅炖大鹅!" << endl;
return a + b;
}
};
int main()
{
// 发生多态的条件
// 1. 继承关系
// 2. 子类中重写父类的虚函数
// 3. 父类的指针或引用指向子类对象
// 方式1:父类引用指向子类对象
// Plus base;
// calculator& p = base;
// p.a...
// 方式2:父类指针指向子类地址
Plus* base = new Plus;
calculator* p = base;
p->a = 2;
p->b = 5;
cout << p->add() << endl;
delete(p);
return 0;
}
1. Outros conceitos em polimorfismo: funções virtuais puras , classes abstratas
A implementação interna de funções virtuais na classe pai geralmente não tem sentido, então simplesmente remova todas elas e reescreva-as como:
class calculator
{
public:
virtual int add() = 0;
...
Isso é muito mais simples, mas transformará a função virtual em uma função virtual pura . A função virtual pura tem as seguintes características:
1. Uma classe contendo uma função virtual pura é chamada de classe abstrata , e uma classe abstrata não pode instanciar objetos !
2. Se uma subclasse de uma classe abstrata não substituir a função virtual pura na classe pai, a subclasse também será chamada de classe abstrata (envenenada profundamente)
2. Outros conceitos em polimorfismo: destruição virtual , destruição virtual pura
Se uma subclasse possui atributos alocados para o heap, ela deve ser deletada em seu próprio código destruidor, assim:
class Plus : public calculator
{
public:
Plus() {
s = new string("abc");
}
int add() {
return a + b;
}
~Plus() {
cout << "子类析构" << endl;
delete(s);
}
string* s;
};
No entanto, sob a premissa de que o polimorfismo é acionado por " o ponteiro da classe pai aponta para o endereço da subclasse " (não existe tal problema quando a referência da classe pai aponta para o objeto da subclasse!), apenas o destruidor da classe pai e o destruidor da subclasse será chamada no final do programa. Ela não pode ser executada. Deve ser porque um objeto não é realmente criado quando new é usado, então o destruidor da subclasse não tem chance de ser executado.
Neste momento, você precisa alterar o destruidor da classe pai para um destruidor virtual ou um destruidor virtual puro para executar o código do destruidor da subclasse. Isto é alcançado como se segue:
class calculator
{
public:
virtual int add() = 0;
int a;
int b;
virtual ~calculator() {
}; // 虚析构就加个virtual
};
class calculator
{
public:
virtual int add() = 0;
int a;
int b;
virtual ~calculator() = 0; // 纯虚析构需要类外实现
};
calculator::~calculator() {
}
Não deve haver diferença entre os dois. Além disso, as classes que contêm destruidores virtuais puros também são classes abstratas . Observe que