En C++, lorsque nous utilisons le mot-clé virtual pour définir un membre de fonction, cela signifie que la fonction est une fonction virtuelle et peut être remplacée par des sous-classes. Cependant, si nous définissons un membre de données (c'est-à-dire un attribut) comme virtuel, le compilateur C++ signalera une erreur : les membres virtuels ne peuvent pas être des membres de données statiques ou non statiques.
Alors pourquoi le virtuel ne peut-il pas être utilisé pour les membres de données ? Parce que la différence entre les fonctions virtuelles et les fonctions non virtuelles réside dans le fait que les fonctions virtuelles sont accessibles via la table de fonctions, tandis que les données membres sont accessibles directement. Si nous définissons le membre de données comme virtuel, le programme générera une erreur car il ne trouvera pas la fonction virtuelle.
Et si vous avez vraiment besoin de remplacer une variable membre dans une sous-classe ? Vous pouvez utiliser une nouvelle fonctionnalité introduite dans C++11 : l'héritage virtuel. L'héritage virtuel est une méthode d'héritage spéciale qui peut réduire la complexité de l'héritage multiple et résoudre certains problèmes. En héritage virtuel, le constructeur de la classe de base ne sera appelé qu'une seule fois, évitant ainsi les problèmes causés par les initialisations multiples.
Ce qui suit est un exemple de code qui utilise l'héritage virtuel pour implémenter des variables membres de remplacement :
class Base { public: virtual int& getVar() { return var; } protected: int var; }; class Derived : virtual public Base { public: virtual int& getVar() { return var; } protected: int var; }; int main() { Base* b = new Derived(); b->getVar() = 42; cout << b->getVar() << endl; return 0; }
Dans cet exemple de code, nous définissons une classe de base Base et une classe dérivée Derived. Il existe une variable entière var dans la classe Base. Nous la définissons comme un type virtuel. Bien que cette variable ne soit pas accessible de cette manière, cette fonction peut être utilisée comme classe de base pour la réécriture par les classes dérivées. La classe Derived a également une variable entière nommée var, et elle remplace la fonction getVar() dans Base, couvrant la fonction dans Base. Dans la fonction principale, nous créons une instance de Derived, pointons dessus avec le pointeur de classe de base b et y accédons via la fonction getVar(). La sortie est 42.
En utilisant l'héritage virtuel, nous pouvons remplacer la variable membre nommée var dans la classe de base dans la classe dérivée et accéder à la valeur de cette variable, réalisant ainsi une opération similaire à la substitution d'une fonction.
En résumé, le mot-clé virtual en C++ ne peut être utilisé que pour les fonctions, pas pour les données membres. Si vous souhaitez remplacer une variable membre dans une sous-classe, vous pouvez utiliser l'héritage virtuel. L'héritage virtuel peut éviter le problème de l'initialisation multiple et peut accéder aux variables membres remplacées dans la classe de base.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!