c++ polymorphism destructor pure-virtual

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/