¿Está mal escribir:
class A {
public:
virtual ~A() = 0;
};
para una clase base abstracta?
Al menos eso se compila en MSVC ... ¿Se bloqueará en tiempo de ejecución?
¿Está mal escribir:
class A {
public:
virtual ~A() = 0;
};
para una clase base abstracta?
Al menos eso se compila en MSVC ... ¿Se bloqueará en tiempo de ejecución?
Respuestas:
Si. También necesita implementar el destructor:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
Debería ser suficiente.
Y dado que esto obtuvo un voto negativo, debo aclarar: si obtiene algo de A y luego trata de eliminarlo o destruirlo, A
finalmente se llamará al destructor. Como es puro y no tiene una implementación, se producirá un comportamiento indefinido. En una plataforma popular, invocará el controlador de llamada pura y se bloqueará.
Editar: arreglando la declaración para que sea más conforme, compilada con http://www.comeaucomputing.com/tryitout/
Destructores privados: le darán un error cuando cree un objeto de una clase derivada, no de otra manera. Sin embargo, puede aparecer un diagnóstico.
12.4 Destructores
6 Un destructor puede declararse virtual (10.3) o virtual puro (10.4); Si se crea algún objeto de esa clase o cualquier clase derivada en el programa, 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 calificada (5.1).
[ Nota : una declaración de función no puede proporcionar tanto un especificador puro como una definición: nota final]
Tomado directamente del borrador:
struct C {
virtual void f() = 0 { }; // ill-formed
};