Tengo un puntero de clase base apuntando a un objeto de clase derivado. Llamo a la función foo()
usando dos formas diferentes en el código a continuación. ¿Por qué se llama a Derived::foo()
en el primer caso? ¿No debería llamar al (*obj).foo()
Base::foo()
función ya que ha sido desreferenciado?Llamada a funciones virtuales utilizando el objeto de desreferencia
class Base
{
public:
Base() {}
virtual void foo() { std::cout << "Base::foo() called" << std::endl; }
virtual ~Base() {};
};
class Derived: public Base
{
public:
Derived() : Base() {}
virtual void foo() { std::cout << "Derived::foo() called" << std::endl; }
virtual ~Derived() {};
};
int main() {
Base* obj = new Derived();
// SCENARIO 1
(*obj).foo();
// SCENARIO 2
Base obj1 = *obj;
obj1.foo();
return 0;
}
Vale la pena describir las rebanadas. –