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 ?