Compreendendo o polimorfismo C++

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.

  1. 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

Supongo que te gusta

Origin blog.csdn.net/ayitime/article/details/126324512
Recomendado
Clasificación