Destructor virtual puro en C++
polymorphism pure-virtual (2)
¿Es malo escribir?
class A {
public:
virtual ~A() = 0;
};
para una clase base abstracta?
Al menos eso compila en MSVC ... ¿Se bloqueará en tiempo de ejecución?
Destructores privados: le darán un error cuando cree un objeto de una clase derivada, de lo contrario. Un diagnóstico puede aparecer sin embargo.
12.4 Destructores
6 Un destructor puede ser declarado virtual (10.3) o puro virtual (10.4); si se crean en el programa objetos de esa clase o cualquier clase derivada, se definirá el destructor.
Una clase con un destructor virtual puro es una clase abstracta. Buena nota:
10.4 clases abstractas
2 Una función virtual pura solo debe definirse si se llama con, o como con (12.4), la sintaxis de id calificado (5.1).
[ Nota : una declaración de función no puede proporcionar un especificador puro y una definición-nota final]
Tomado directamente del borrador:
struct C {
virtual void f() = 0 { }; // ill-formed
};
Sí. También necesita implementar el destructor:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
debería ser suficiente.
Y como esto obtuvo un voto negativo, debería aclarar: si deriva algo de A y luego intenta eliminarlo o destruirlo, eventualmente se llamará al destructor de A
Como es puro y no tiene una implementación, se producirá un comportamiento indefinido. En una plataforma popular, invocará el controlador purecall y se bloqueará.
Editar: arreglando la declaración para que sea más conforme, compilado con http://www.comeaucomputing.com/tryitout/