Sé que esta pregunta debe haber sido cubierta un sinfín de veces, pero he buscado en las preguntas anteriores, y nada parece reventar.Llamando a la función virtual en la subclase de la superclase
Se trata de la herencia y las funciones virtuales i C++. Tengo un problema al llamar funciones virtuales en subclases de la superclase.
Déjeme dar un ejemplo. Comienzo con tres clases, que heredan el uno del otro.
class A {
void foo() { bar() }
virtual void bar() { }
};
class B : public A {
virtual void bar() { }
};
class C : public B {
virtual void bar() { // do something }
};
Ahora quiero tener una variable declarada como B * pero instanciada como C *.
B* myObject = new C();
myObject->foo();
Cuando hago esto, y llamar a foo() en myObject, entonces A :: foo() está llamando bar(). Pero solo se llama a B :: bar(), no a C :: Bar() - que en realidad es myObject, a pesar de que está declarado como B, lo que de nuevo afecta que "// no haga nada" no se ejecuta.
¿Cómo le digo a A :: foo() que necesita ver la implementación más baja?
Tiene sentido?
// Trenskow
EDIT:
C :: Foo no es el problema. Foo es llamado en la clase A, ya que es el único lugar donde se implementa. El problema surge cuando A: Foo llama a Bar(). Luego se llama B: Bar y no C :: Bar.
Tal vez el problema es que en mi aplicación, solo me dan un puntero void * al objeto en A.
De esta manera:
void A:Foo(void *a) {
A* tmpA = static_cast<A*> (a);
tmpA->bar();
}
Ahora el compilador piensa, que es un Tmpa R. Pero de alguna manera se las arregla para darse cuenta de que es un B *, y llama a B :: Bar, cuando en realidad tmpA es un C * y debería estar llamando a C :: Bar.
Si ha publicado un código real, entonces podríamos decir que el problema es. No necesitas hacer nada especial. Si los errores de sintaxis son fijos, el código ('myObject-> foo();') llamará a 'C :: bar()'. – UncleBens
... pero si tuviera que adivinar, o 'C' en realidad no anula' bar' (con una firma diferente), o está cortando el objeto en algún lugar (haciendo algo como '* variable = * myObject;' – UncleBens
Todavía no lo compro. ¿Por qué no se llamaría a C :: bar()? ¿Puedes publicar el código real? – EboMike