Cuándo usar destructores virtuales en C++ y qué sucede si no se declaran
¡Hola a todos! Acabo de empezar a aprender C++ y no puedo entender una cosa. Miren:
Tengo una clase base `Base` y una clase derivada `Derived`. En `Derived` asigno memoria en el heap. Cuando creo un objeto a través de un puntero a la clase base y luego lo elimino con `delete`, solo se llama al destructor de `Base`, pero no al destructor de `Derived`. Esto provoca una fuga de memoria porque la memoria asignada en la clase derivada no se libera.
Sé que necesito agregar `virtual` antes del destructor en la clase base, y entonces todo funciona. Pero ¿por qué sucede esto? ¿Acaso no escribí explícitamente código que debería llamar al destructor de la clase derivada? ¿O estoy confundiendo algo?
Aquí hay un ejemplo de código que no funciona (o mejor dicho, funciona pero con fuga de memoria):
```cpp
class Base {
public:
~Base() { std::cout << "Base destructor\n"; }
};
class Derived : public Base {
private:
int* data;
public:
Derived() { data = new int[100]; }
~Derived() {
delete[] data;
std::cout << "Derived destructor\n";
}
};
int main() {
Base* ptr = new Derived();
delete ptr; // Solo llama a ~Base(), no a ~Derived()
return 0;
}
```