All'interno di una gerarchia di classi C++, è possibile applicare un requisito che una determinata funzione virtuale chiama sempre anche l'implementazione della sua classe base? (Come la catena dei costruttori di modo?)Richiesta di funzioni virtuali sovrascritte per chiamare le implementazioni di base
Sto osservando un caso in cui una gerarchia di classi profonde ha alcune funzioni di interfaccia comuni che ogni bambino sovrascrive. Vorrei che l'override di ogni classe derivata passasse attraverso la classe base. È semplice farlo esplicitamente con ad esempio il codice qui sotto, ma c'è il rischio che qualcuno che implementa una nuova classe derivata possa dimenticare di collegarsi alla base.
C'è qualche schema per far rispettare questo, in modo che il compilatore genererà un errore se un override non riesce a concatenare la base?
Così, in
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!
}
}
c'è un modo, un po 'di trucco o modello espediente sintattico, per fare CDD gettare un errore più evidente?
Non che io sappia, ma si può sempre dare le baseclass una funzione non virtuale e memorizzare un elenco di puntatori a funzione, al quale ogni classe derivata aggiunge la sua parte. –
Effettivamente un duplicato di [Come forzare la stessa funzione virtuale del figlio chiama prima la sua funzione virtuale padre] (http://stackoverflow.com/questions/5644338/how-to-force-child-same-virtual-function-call-its -parent-virtual-function-first) –
possibile duplicato di [C++: chiamare automaticamente un metodo di classe base?] (http://stackoverflow.com/questions/3107974/c-call-a-base-class-method-automatically) – outis