Maison >développement back-end >C++ >Comment puis-je appeler la fonction virtuelle d'une classe de base à partir d'une classe dérivée en C ?

Comment puis-je appeler la fonction virtuelle d'une classe de base à partir d'une classe dérivée en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-13 02:28:09902parcourir

How Can I Call a Base Class's Virtual Function from a Derived Class in C  ?

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 :

  • le remplacement est facultatif mais recommandé pour aider le compilateur à garantir un remplacement approprié.
  • Foo::printStuff() appelle explicitement la fonction de la classe de base.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn