Dentro de una jerarquía de clases C++, ¿es posible imponer el requisito de que una función virtual particular siempre invoque también la implementación de su clase base? (Al igual que la cadena de constructores de forma?)Requerir funciones virtuales anuladas para llamar a implementaciones base
Estoy viendo un caso en el que una jerarquía de clases profundas tiene algunas funciones comunes de interfaz que cada niño anula. Me gustaría que cada anulación de clase derivada se encadenara a la clase base. Es sencillo hacerlo explícitamente con , por ejemplo,, el código siguiente, pero existe el riesgo de que alguien que implementa una nueva clase derivada se olvide de encadenarse a la base.
¿Hay algún patrón para imponer esto, de modo que el compilador arrojará un error si una anulación falla al encadenar la base?
Así, 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!
}
}
hay una manera, algún truco truco plantilla o sintáctico, para hacer CDD lanzar un error más obvio?
que yo sepa, pero siempre se puede dar a los baseclass una función no virtual y almacenar una lista de punteros a funciones, a los que cada clase derivada añade su parte. –
Efectivamente, un duplicado de [Cómo forzar al hijo a la misma función virtual a llamar primero a su función virtual principal] (http://stackoverflow.com/questions/5644338/how-to-force-child-same-virtual-function-call-its -parent-virtual-function-first) –
posible duplicado de [C++: ¿Llamar a un método de clase base automáticamente?] (http://stackoverflow.com/questions/3107974/c-call-a-base-class-method-automatically) – outis