17 votes

Obliger les fonctions virtuelles surchargées à appeler les implémentations de base

Dans une hiérarchie de classes C++, est-il possible d'imposer qu'une fonction virtuelle particulière appelle toujours l'implémentation de sa classe de base ? (Comme la façon dont les constructeurs s'enchaînent ?)

J'étudie le cas d'une hiérarchie de classes profonde qui possède des fonctions d'interface communes que chaque enfant remplace. J'aimerais que la surcharge de chaque classe dérivée se répercute sur la classe de base. Il est facile de faire cela explicitement avec la fonction par exemple le code ci-dessous, mais il y a le risque que quelqu'un implémentant une nouvelle classe dérivée puisse oublier de chaîner à la base.

Existe-t-il un modèle permettant de faire respecter cette règle, de sorte que le compilateur génère une erreur si une surcharge ne parvient pas à enchaîner la base ?

Ainsi, en

class CAA 
{
   virtual void OnEvent( CEvent *e ) { 
     // do base implementation stuff;
   }
}

class CBB : public CAA
{
   typedef CAA BaseClass;
   virtual void OnEvent( CEvent *e ) { 
       DoCustomCBBStuff();
       BaseClass::OnEvent( e ); // chain to base
   }
}

class CCC : public CBB
{
   typedef CBB BaseClass;
   virtual void OnEvent( CEvent *e ) { 
       Frobble();
       Glorp();
       BaseClass::OnEvent( e ); // chain to CBB which chains to CAA, etc
   }
}

class CDD : public CCC
{
   typedef CCC BaseClass;
   virtual void OnEvent( CEvent *e ) { 
       Meep();
       // oops! forgot to chain to base!
   }
}

Y a-t-il un moyen, une astuce de template ou de syntaxe, pour que CDD affiche une erreur plus évidente ?

0voto

Zinovy Nis Points 132

Il y a une vérification clang-tidy pour cela : https://reviews.llvm.org/rCTE329448 (fait par moi, donc vous pouvez m'adresser toute question à ce sujet)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X