Cela peut sembler une question simple, mais je ne trouve la réponse nulle part ailleurs.
Supposons que j'ai ce qui suit:
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
Est-ce normal que la classe Derived n'implémente pas la fonction bar ()? Et si TOUTES mes classes dérivées ont besoin de la fonction bar (), mais certaines le font. Toutes les fonctions virtuelles d'une classe de base abstraite doivent-elles être implémentées dans les classes dérivées, ou juste celles qui sont purement virtuelles? Merci
la source
Derived::bar
un corps de fonction, celui deAbstract::bar
. Il semble donc que l'unité de traduction où cela est défini (est-elle même définie quelque part?) N'est pas liée à l'unité de traduction où elle est appelée.They only need to implement the pure ones.
C'est trompeur. Les classes dérivées n'ont pas nécessairement besoin d'implémenter des fonctions virtuelles pures non plus.Seules les méthodes virtuelles pures doivent être implémentées dans des classes dérivées, mais vous avez toujours besoin d'une définition (et pas seulement d'une déclaration) des autres méthodes virtuelles. Si vous n'en fournissez pas un, l'éditeur de liens pourrait très bien se plaindre.
Donc, mettre juste
{}
après votre méthode virtuelle facultative vous donne une implémentation par défaut vide:class Abstract { public: virtual void foo() = 0; // pure virtual must be overridden virtual void bar() {} // virtual with empty default implementation }; class Derived : Abstract { public: virtual void foo(); };
Une implémentation par défaut plus impliquée irait cependant dans un fichier source séparé.
la source
La norme ISO C ++ spécifie que toutes les méthodes virtuelles d'une classe qui ne sont pas purement virtuelles doivent être définies.
En termes simples, la règle est la suivante:
si votre classe dérivée remplace la méthode virtuelle de la classe de base, elle doit également fournir une définition.Sinon, la classe de base doit fournir la définition de cette méthode.
Conformément à la règle ci-dessus dans votre exemple de code,
virtual void bar();
nécessite une définition dans la classe de base.Référence:
C ++ 03 Standard: 10.3 Fonctions virtuelles [class.virtual]
Vous devez donc soit rendre la fonction purement virtuelle, soit lui fournir une définition.
La faq gcc le révèle également:
la source
Oui, c'est très bien ... il vous suffit d'implémenter des fonctions virtuelles pures pour instancier une classe dérivée d'une classe de base abstraite.
la source
Oui, il est correct qu'une classe dérivée doit SUPPRIMER la fonction qui est Pure Virtual dans la classe parent. La classe parent ayant une fonction virtuelle pure est appelée classe abstraite uniquement parce que sa classe enfant doit donner son propre corps de la fonction virtuelle pure.
Pour les fonctions virtuelles normales: - Il n'est pas nécessaire de les remplacer davantage, car certaines classes enfants peuvent avoir cette fonction, d'autres ne l'ont pas.
L'objectif principal du mécanisme de fonction virtuelle est le polymorphisme d'exécution, si l'objectif principal de la fonction virtuelle pure (classe abstraite) est de rendre obligatoire le même nom Function avec son propre corps.
la source