Devez-vous déclarer des méthodes remplaçant une fonction virtuelle pure dans une classe de base? Si oui, pourquoi? Étant donné que la classe de base a déclaré les méthodes comme virtuelles pures, et qu'elles DOIVENT donc exister dans la classe dérivée, il ne devrait pas être nécessaire de les redéclarer dans la classe dérivée avant de pouvoir les implémenter en dehors de la définition de classe. N'êtes-vous pas d'accord?Redéfinition de méthodes virtuelles pures en C++
Répondre
Oui vous avez.
La raison de ceci est de faire savoir au compilateur que la méthode virtuelle est implémentée par la classe dérivée puisqu'une classe dérivée peut aussi être abstraite et avoir des méthodes virtuelles. Puisque les unités de compilation sont compilées séparément, le compilateur ne pourrait pas savoir si une méthode virtuelle est implémentée par une classe dérivée lors de la compilation d'une autre unité de compilation qui utilise les cals dérivées et donc s'il s'agit d'une classe abstraite ou non.
Je comprends maintenant, merci. –
La définition de classe comme le nom l'indique est la déclaration de la classe. Si vous ne déclarez pas de fonction dérivée (du virtuel pur), le compilateur ne le trouvera pas.
Vous devez déduire les fonctions virtuelles pures uniquement si votre classe est instanciée. Vous pouvez avoir une fonction virtuelle pure de classe A, une classe B qui hérite de la classe A mais pas de fonctions dérivées, puis une classe C qui hérite de la classe B avec réimplémentation de la fonction dérivée. Dans ce cas, seule la classe C peut être instanciée, alors pourquoi le compilateur devrait-il ajouter une déclaration de classe dérivée dans la classe B? C'est pourquoi vous devez indiquer au compilateur quelle classe réimplémente les fonctions virtuelles pures.
Vous n'avez pas à redéfinir la déclaration de la classe de base. Si vous ne le faites pas, la classe dérivée est simplement abstraite. Ainsi, la déclaration dans la classe dérivée sert un but précis, et vous en avez besoin.
C'est juste la façon dont le langage est défini, donc mieux s'y habituer :-) Btw il peut ne pas exister dans une classe dérivée dans le cas où c'est aussi "abstrait". Je crois que c'est un dupe, si je trouve l'original, je vais le lier ... –
remplacement -> devrait être mieux remplacé (OOP lingo) – DumbCoder