Question

Quelle est la différence entre les deux déclarations suivantes?

virtual void calculateBase() = 0;  
virtual void calculateBase();

Je lis la première (= 0) est une "fonction abstraite pure" mais qu'est-ce que cela fait le second?

Était-ce utile?

La solution

La première s'appelle une fonction virtuelle pure. Normalement, les fonctions virtuelles pures n’auront aucune implémentation et vous ne pourrez pas créer une instance d’une classe contenant une fonction virtuelle pure.

La seconde est une fonction virtuelle (c’est-à-dire une fonction virtuelle 'normale'). Une classe fournit l'implémentation de cette fonction, mais sa classe dérivée peut remplacer cette implémentation en fournissant sa propre implémentation pour cette méthode.

Autres conseils

Le premier est un "pur virtuel". - la classe sera abstraite, toute tentative d’instanciation entraînera des erreurs de compilation. Il est destiné à être utilisé comme classe de base où la classe dérivée implémente le comportement nécessaire en implémentant la fonction virtuelle pure. Vous n'êtes pas obligé d'implémenter la fonction dans la classe de base.
C'est un motif souvent utilisé pour deux motifs:

  • Le modèle de design "Méthode de modèle" & , dans lequel la classe de base implémente une structure un appel de fonction, mais les détails de l'appel de fonction doivent être renseignés par la classe dérivée, et
  • L’interface " " motif de conception, car C ++ n’a pas le mot clé interface. Les classes de base abstraites, idéalement avec uniquement des fonctions virtuelles pures et aucune donnée membre, constituent le moyen de définir des interfaces en C ++.

La deuxième déclaration est juste une déclaration de fonction de membre virtuel ordinaire. Vous obtiendrez des erreurs de compilation si vous ne parvenez pas à implémenter la fonction membre dans la classe de base. C’est toujours virtuel, ce qui implique qu’il peut être utile de remplacer le comportement dans une classe dérivée.

Le premier ne doit pas nécessairement être implémenté dans la classe de base, mais il doit être implémenté dans les classes héritées.

Vous devez implémenter le second dans la classe de base et il peut être implémenté dans des classes héritées.

En principe, lors de l'héritage, vous êtes obligé de remplacer le premier et il est autorisé à à remplacer le second.

Venant de Java, n'est-ce pas?

Je pense que vous mélangez les termes ...

virtual void x() = 0;

est une fonction virtuelle pure , ou une fonction abstraite. C'est une fonction virtuelle sans implémentation. Vous parlez d'une classe abstraite pure, qui est l'équivalent c ++ d'une interface, d'une classe n'ayant que des fonctions abstraites.

virtual void x();

est une fonction virtuelle, ce qui signifie qu'elle peut être redéfinie dans des classes dérivées, mais ce n'est pas abstrait, vous devez donc lui fournir une implémentation.

  

virtual void CalculateBase () = 0;

La première fonction est une fonction virtuelle pure dans laquelle l’implémentation ne peut pas être effectuée dans la classe et qui agit comme une classe abstraite pure ou une classe d’interface. La mise en œuvre concrète doit être effectuée ou annulée dans la sous-classe. Il agit en tant que classe d’interface avec ses classes dérivées.

  

virtual void CalculateBase ();

Cette fonction est une fonction virtuelle où l'implémentation (par défaut) peut être effectuée dans la classe de base. Mais la classe dérivée doit être annulée par sa propre mise en oeuvre.

En Java

virtual void calculateBase() = 0;  

serait

abstract void calculateBase();

et

virtual void calculateBase();

serait

void calculateBase();

Pour être parfaitement clair,

final void calculateBase();

en C ++, est "le même" comme

<*>

en Java. C'est-à-dire que la fin est "& default;" " en C ++. Il existe toutefois une exception à cette règle. Lorsque vous sous-classez une classe avec une méthode virtuelle et que vous la réimplémentez sans utiliser le mot-clé virtual, la méthode de la sous-classe ne sera pas finale.

La deuxième fonction doit avoir une implémentation dans la classe qui la déclare (absence de '= 0'), et peut être remplacé par des sous-classes.

La première fonction peut ou non avoir une implémentation dans la classe qui la déclare, et doit être implémentée par des sous-classes

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top