Invocation d'une fonction virtuelle de classe de base malgré le remplacement en C
Dans la programmation orientée objet, il est courant que les classes dérivées remplacent les fonctions virtuelles de leurs classes de base. Cependant, des situations peuvent survenir dans lesquelles la classe dérivée nécessite l'accès à la fonction remplacée.
Considérez le code C suivant :
class Foo { public: int x; virtual void printStuff() { std::cout << x << std::endl; } }; class Bar : public Foo { public: int y; void printStuff() { // I would like to call Foo.printStuff() here... std::cout << y << std::endl; } };
Dans l'exemple ci-dessus, la classe Bar remplace la fonction printStuff, mais il peut également avoir besoin d'accéder à la version de la classe de base.
Le super vs. C de Java Syntaxe
En Java, la syntaxe super.funcname() permet aux classes dérivées d'appeler des méthodes de classe de base. Cependant, C nécessite une approche différente. Pour appeler la fonction de classe de base remplacée, utilisez la syntaxe suivante :
class Bar : public Foo { // ... void printStuff() override { // help the compiler to check Foo::printStuff(); // calls base class' function } };
Dans cette syntaxe :
Cette dénomination explicite est nécessaire car C permet l'héritage multiple, contrairement à Java. Par conséquent, le compilateur doit savoir quelle méthode de classe de base appeler en cas de substitution.
Exemple d'utilisation
En revenant au code d'origine, la modification suivante permet à Bar : :printStuff() pour accéder à la fois à son propre membre de données y et au membre de données de la classe de base x :
void printStuff() override { Foo::printStuff(); std::cout << y << std::endl; }
Cette version améliorée des sorties printStuff la valeur x de la classe de base, suivie de la valeur y de la classe dérivée, fournissant la fonctionnalité souhaitée.
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!