Fonctions virtuelles et fonctions virtuelles pures en C++

fonction virtuelle

Le noyau de l'orienté objet est le polymorphisme, et les fonctions virtuelles sont le noyau du polymorphisme.Avant de parler de fonctions virtuelles, nous devons d'abord parler de polymorphisme, qu'est-ce que le polymorphisme. Prononcer des mots humains : le pointeur du type de classe parent pointe vers la sous-classe, puis utilise le pointeur de la classe parent pour appeler la fonction de la sous-classe. Mais il y a un problème : la fonction appelée avec le pointeur de classe parent exécutera la méthode dans la classe parent quel que soit le type.

#include <iostream>
using namespace std;

class AA {
public:
    void show() {
        cout << "调用父类AA的show()方法" << endl;
    }
};

class BB : public AA{
public:
    void show() {
        cout << "调用子类BB的show()方法" << endl;
    }
};

int main() {
    AA* a = new BB();
    a->show();
}

Évidemment, le pointeur de AA pointe vers BB, mais la méthode d'exécution est bien AA

Pour résoudre ce problème, il existe des fonctions virtuelles. Ajoutons virtual avant la méthode show de AA. essayez d'abord

#include <iostream>
using namespace std;

class AA {
public:
    virtual void show() {
        cout << "调用父类AA的show()方法" << endl;
    }
};

class BB : public AA{
public:
    void show() {
        cout << "调用子类BB的show()方法" << endl;
    }
};

int main() {
    AA* a = new BB();
    a->show();
}

Il est bien évident que la méthode de BB s'appelle.

La différence entre les fonctions virtuelles et non virtuelles

La fonction non virtuelle est en fait déterminée en fonction du type de l'objet, de la référence ou du pointeur qui appelle la fonction au moment de la compilation. Dans le premier programme en cours d'exécution, le type de pointeur de a est AA, donc la méthode show dans la classe AA est appelé.

La fonction virtuelle ne peut déterminer quelle fonction appeler qu'au moment de l'exécution et sélectionne dynamiquement la fonction membre appropriée pendant la phase d'exécution du programme. S'il y a une réécriture dans la sous-classe, la version réécrite sera exécutée. Sinon, la fonction virtuelle (parent version de classe).

Comment fonctionnent les fonctions virtuelles

Les fonctions virtuelles sont implémentées via une table de fonctions virtuelles. VTable pour faire court. Dans cette table, il s'agit principalement d'une table d'adresses de fonctions virtuelles d'une classe.Cette table résout le problème d'héritage et de couverture, ce qui équivaut à une carte, indiquant la fonction réelle qui doit être appelée.

fonction virtuelle pure

Une fonction virtuelle pure est un type spécial de fonction virtuelle. Dans certains cas, la classe de base ne peut pas fournir une implémentation significative pour la fonction virtuelle, elle est donc déclarée comme une fonction virtuelle pure.

Par exemple : une classe d'animaux peut avoir des chats, des chiens, des tigres, des lions, etc. Mais il est évidemment déraisonnable pour vous d'utiliser l'animal lui-même pour générer des objets. Par exemple, les chats peuvent grimper aux arbres, mais tous les animaux ne peuvent pas grimper aux arbres.Afin d'éviter d'utiliser directement la classe mère (classe animale) pour créer des objets, il faut utiliser des fonctions virtuelles pures.

#include <iostream>
using namespace std;

class animal {
public:
    virtual void  pashu() = 0;

class cat : public animal {
public:
    void pashu() {
        cout << "我是小猫,我会爬树" << endl;
    }
};


int main() {
    animal* a = new cat();
    a->pashu();

    animal* a = new animal();   // 直接报错

}

Une fonction virtuelle pure réserve le nom d'une fonction dans la classe de base pour la classe dérivée afin que la classe dérivée puisse le redéfinir. Le polymorphisme ne peut pas être pris en charge si le nom de la fonction n'est pas conservé dans la classe de base. Une classe contenant des fonctions virtuelles pures est appelée une classe abstraite, les objets ne peuvent pas être instanciés et des pointeurs et des références peuvent être créés.

La classe dérivée doit redéfinir la fonction virtuelle pure dans la classe abstraite, sinon c'est aussi une classe abstraite.

La déclaration d'une fonction virtuelle pure indique au concepteur de la sous-classe : "Vous devez fournir une implémentation d'une fonction virtuelle pure, mais je ne sais pas comment vous allez l'implémenter"

Je suppose que tu aimes

Origine blog.csdn.net/qq_35326529/article/details/128975709
conseillé
Classement