web-dev-qa-db-fra.com

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

Duplicate possible:
Explication virtuelle C++/virtuelle pure

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

Je sais que "Pure Virtual Function est une fonction virtuelle sans corps", mais qu'est-ce que cela signifie et qu'est-ce qui est réellement fait par la ligne ci-dessous:

virtual void virtualfunctioname() = 0
196
Sachin Chourasiya

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 dynamique de l'objet 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 crée implicitement la classe pour laquelle elle est définie 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 fonctionnalité intéressante du C++ est qu'une classe peut définir une fonction virtuelle pure ayant une implémentation. ( Ce qui est bon pour est discutable .)


Notez que C++ 11 a apporté une nouvelle utilisation aux 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 celui-ci pour plus d'informations sur cette utilisation de delete et default.

245
sbi

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, l'implémentation n'est pas fournie pour les fonctions virtuelles pures. Vous pouvez rendre une fonction pure virtuelle avec =0 à la fin de la déclaration de la fonction. De plus, une classe contenant une fonction virtuelle pure est abstraite, c’est-à-dire que vous ne pouvez pas créer d’objet de cette classe.

29
Naveen

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 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 implémenter la fonction virtuelle pure:

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

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

19
Johann Gerell

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 ne puisse être instanciée.

8
AshleysBrain