Différence entre une fonction virtuelle et une fonction virtuelle pure

Duplication possible:
C ++ Virtual / Pure Virtual Explained

Quelle est la différence entre une fonction virtuelle pure et une fonction virtuelle?

Je sais que “la fonction virtuelle pure est une fonction virtuelle sans corps”, mais qu’est-ce que cela signifie et ce que fait réellement la ligne ci-dessous:

virtual void virtualfunctioname() = 0 

Une fonction virtuelle fait de sa classe une classe de base polymorphe . Les classes dérivées peuvent remplacer les fonctions virtuelles. Les fonctions virtuelles appelées via des pointeurs / références de classe de base seront résolues au moment de l’exécution. C’est-à-dire que le type dynamic de l’object est utilisé à la place de son type statique :

  Derived d; Base& rb = d; // if Base::f() is virtual and Derived overrides it, Derived::f() will be called rb.f(); 

Une fonction virtuelle pure est une fonction virtuelle dont la déclaration se termine par =0 :

 class Base { // ... virtual void f() = 0; // ... 

Une fonction virtuelle pure fait implicitement définir la classe pour abstract (contrairement à Java où vous avez un mot-clé pour déclarer explicitement le résumé de classe). Les classes abstraites ne peuvent pas être instanciées. Les classes dérivées doivent remplacer / implémenter toutes les fonctions virtuelles pures héritées. S’ils ne le font pas, ils deviendront eux aussi abstraits.

Une caractéristique intéressante de C ++ est qu’une classe peut définir une fonction virtuelle pure ayant une implémentation. ( Ce qui est bon est discutable .)


Notez que C ++ 11 a apporté une nouvelle utilisation des mots-clés delete et default qui ressemble à la syntaxe des fonctions virtuelles pures:

 my_class(my_class const &) = delete; my_class& operator=(const my_class&) = default; 

Voir cette question et celle-ci pour plus d’informations sur cette utilisation de delete et default .

Pour une fonction virtuelle, vous devez fournir une implémentation dans la classe de base. Cependant, la classe dérivée peut remplacer cette implémentation par sa propre implémentation. Normalement, pour les fonctions virtuelles pures, l’implémentation n’est pas fournie. Vous pouvez rendre une fonction virtuelle avec =0 à la fin de la déclaration de fonction. De plus, une classe contenant une fonction virtuelle pure est abstraite, c’est-à-dire que vous ne pouvez pas créer d’object de cette classe.

Une fonction virtuelle pure n’est généralement pas (mais peut être) implémentée dans une classe de base et doit être implémentée dans une sous-classe de feuille.

Vous notez ce fait en ajoutant le “= 0” à la déclaration, comme ceci:

 class AbstractBase { virtual void PureVirtualFunction() = 0; } 

Ensuite, vous ne pouvez pas déclarer et instancier une sous-classe sans qu’elle implémente la fonction virtuelle pure:

 class Derived : public AbstractBase { virtual void PureVirtualFunction() override { } } 

En ajoutant le mot-clé override , le compilateur s’assurera qu’il existe une fonction virtuelle de classe de base avec la même signature.

Vous pouvez réellement fournir des implémentations de fonctions virtuelles pures en C ++. La seule différence est que toutes les fonctions virtuelles pures doivent être implémentées par des classes dérivées avant que la classe puisse être instanciée.