C ++ fonction virtuelle pure avoir un corps

Les fonctions virtuelles pures (lorsque nous définissons = 0 ) peuvent également avoir un corps de fonction.

Quelle est l’utilité de fournir un corps de fonction pour les fonctions virtuelles pures, si elles ne sont pas appelées du tout?

Votre supposition que la fonction virtuelle pure ne peut pas être appelée est absolument incorrecte. Lorsqu’une fonction est déclarée virtuelle pure, cela signifie simplement que cette fonction ne peut pas être appelée dynamicment , via un mécanisme de répartition virtuel. Cependant, cette même fonction peut facilement être appelée statiquement , non virtuellement , directement (sans répartition virtuelle).

En langage C ++, un appel non virtuel à une fonction virtuelle est effectué lorsqu’un nom qualifié de la fonction est utilisé dans l’appel, c’est-à-dire lorsque le nom de fonction spécifié dans l’appel a le formulaire :: .

Par exemple

 struct S { virtual void foo() = 0; }; void S::foo() { // body for pure virtual function `S::foo` } struct D : S { void foo() { S::foo(); // Non-virtual call to `S::foo` from derived class this->S::foo(); // Alternative syntax to perform the same non-virtual call // to `S::foo` from derived class } }; int main() { D d; dS::foo(); // Another non-virtual call to `S::foo` } 

“Effective C ++” Meyers mentionne une raison pour qu’une fonction virtuelle pure ait un corps: Les classes dérivées qui implémentent cette fonction virtuelle pure peuvent appeler cette implémentation dans leur code. Si une partie du code de deux classes dérivées différentes est similaire, il est logique de la déplacer dans la hiérarchie, même si la fonction doit être virtuelle.

voir ici

Pour la plupart des fonctions virtuelles pures, vous auriez raison. Cependant, pour un destructeur virtuel pur, il est important de définir une implémentation de destructeur correspondante:

  • Le “virtuel pur” consiste à exiger que les classes dérivées implémentent leur destructeur.
  • L’implémentation de votre destructeur de classe de base est telle que les destructeurs de classe dérivés peuvent ensuite “chaîner” par la suite.