¿Cómo llamar a un método virtual puro?
sobes.tech AI
Respuesta de la IA
No es posible llamar directamente a un método virtual puro a través de un puntero a la clase base con un método abstracto o mediante un objeto de esa clase, ya que no tiene una definición en la clase base.
Sin embargo, un método virtual puro puede ser llamado desde el constructor o destructor de una clase derivada, en la cual ese método tiene una implementación. En ese caso, la llamada será resuelta en modo estático, llamando a la implementación de esa clase en la que se realiza la llamada.
Ejemplo de llamada desde el constructor de una clase derivada:
#include <iostream>
class Base {
public:
virtual void pure_virtual_method() = 0; // Método virtual puro
};
class Derived : public Base {
public:
void pure_virtual_method() override {
std::cout << "Implementación en Derived\n";
}
Derived() {
// Llamada a un método virtual puro desde el constructor de la clase derivada
pure_virtual_method();
}
};
int main() {
Derived obj; // Creación de un objeto de la clase derivada, que llama al constructor
return 0;
}
En este ejemplo, al crear el objeto obj de la clase Derived, se llamará al constructor de Derived, en el cual se realiza la llamada a pure_virtual_method(). Como en la clase Derived hay una implementación de este método, será llamada con éxito.
Intentar llamar a un método virtual puro desde el constructor o destructor de una clase base abstracta, en la que está declarado, resultará en un comportamiento indefinido, ya que en el momento de la ejecución del constructor o destructor de la clase base, la vtable aún no está completamente construida o ya ha sido destruida, y la implementación correspondiente en la clase derivada no está disponible.
También es posible llamar a un método virtual puro desde una clase derivada usando la calificación del ámbito (Base::pure_virtual_method()), pero esto solo es posible en la implementación del método virtual puro en la clase derivada, si llama a la implementación de la clase base (lo cual no es posible para un método virtual puro) o a otra función que a su vez llame al método virtual puro (lo que también conduce a un comportamiento indefinido), o para llamar a un método no virtual con el mismo nombre en la clase base.
La forma correcta de interactuar con la lógica presentada por un método virtual puro es crear un objeto de la clase derivada y llamar a esa lógica a través de un puntero o referencia a la clase base (polimorfismo).
#include <iostream>
class Base {
public:
virtual void pure_virtual_method() = 0;
};
class Derived : public Base {
public:
void pure_virtual_method() override {
std::cout << "Implementación en Derived vía polimorfismo\n";
}
};
int main() {
Base* ptr = new Derived(); // Llamada polimórfica
ptr->pure_virtual_method();
delete ptr;
return 0;
}
Por lo tanto, "llamar a un método virtual puro" en el sentido común (a través de un objeto o puntero a la clase base sin definición) no es posible. La llamada solo puede realizarse desde el constructor o destructor de la clase derivada con su implementación, o indirectamente, mediante polimorfismo, creando un objeto de la clase derivada.