La différence entre une fonction virtuelle et une fonction virtuelle pure [dupliquer]

Possibilité De Dupliquer:

C++ Virtual/Pure Virtual Explained

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

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

virtual void virtualfunctioname() = 0
166
demandé sur Community 2010-04-16 14:33:51

4 réponses

une fonction virtuelle fait sa classe A classe de base polymorphe . Les classes dérivées peuvent outrepasser les fonctions virtuelles. Les fonctions virtuelles appelées par l'intermédiaire des pointeurs/références de la classe de base seront résolues à l'exécution. C'est-à-dire que le type dynamique de l'objet est utilisé au lieu 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 dans =0 :

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

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

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


notez que C++11 a apporté une nouvelle utilisation pour les 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 .

210
répondu sbi 2017-05-23 12:18:16

pour une fonction virtuelle, vous devez fournir une implémentation dans la classe de base. Cependant, la classe dérivée peut outrepasser cette implémentation avec sa propre implémentation. Normalement, pour les fonctions purement virtuelles, l'implémentation n'est pas prévue. Vous pouvez faire une fonction pure virtuelle avec =0 à la fin de la déclaration de fonction. En outre, une classe contenant une fonction virtuelle pure est abstraite i.e. vous ne pouvez pas créer un objet de cette classe.

25
répondu Naveen 2010-04-16 10:38:31

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

vous le dénotez en ajoutant le "= 0 "à la déclaration, comme ceci:

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

alors 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 est une fonction virtuelle de classe de base avec la même signature.

15
répondu Johann Gerell 2016-11-08 08:03:46

vous pouvez en fait 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.

8
répondu AshleysBrain 2017-05-23 12:34:37