es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Covarianza de C++, llamada de método hijo.

Creé dos clases simples por herencia, y añadí una función virtual y la sobrescribí en la clase hija.

class Base
{
public:
    virtual Base* getThis() { std::cout << "llamada a Base::getThis()\n"; return this; }
    virtual void func1() { std::cout << "llamada a Base::func1\n"; }
};

class Derived : public Base
{
public:
    Derived* getThis() override { std::cout << "llamada a Derived::getThis()\n";  return this; }
    void func1() override { std::cout << "llamada a Derived::func1\n"; }
    void func2() { std::cout << "llamada a Derived::func2\n"; }
};

Con la covarianza de c++, puedo hacer esto:

int main()
{
    Derived d{};
    Base* b{ &d };
    b->getThis()->func1();
    return 0;
}

Ahora, quisiera llamar a Derived::func2.

b->getThis()->func2();

El código anterior produce el siguiente error: error: 'class Base' has no member named 'func2';;

La única solución que tengo:

dynamic_cast<derived*>(b->getThis())->func2();

¿Tenemos que usar dynamic_cast o static_cast, para llamar a Derived::func2?
¿Existe otro método?</derived*>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, necesitamos usar dynamic_cast o static_cast para llamar a Derived::func2, ya que no es un miembro de la clase Base. Otro método es usar dynamic_cast para verificar si el puntero Base apunta a un objeto Derived y luego llamar a func2 si lo hace. Sin embargo, esto no se recomienda ya que puede llevar a un código que es difícil de leer y mantener. Por lo tanto, es mejor usar una alternativa más segura como dynamic_cast o static_cast para realizar la comprobación de tipo necesaria y convertir el puntero a la clase derivada antes de llamar a la función.

Comments are closed.