Destructor virtual puro en C ++


Respuestas:


218

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, Afinalmente 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/


16
Um, si lo es. Puro solo significa que una clase derivada también necesita proporcionar una implementación.
MSN

72
Implementar funciones virtuales puras es de hecho legal. Muy útil para proporcionar una implementación predeterminada, pero obliga a las subclases a llamarla explícitamente.
jmucchiello

66
MSN y nota si tiene esa definición en la cabecera, es necesario poner "en línea" antes de que para evitar violar la ODR (una regla de definición)
Johannes Schaub - litb

2
¿Por qué A :: ~ A () tiene que definirse explícitamente, ya que pensé que hay un destructor predeterminado para cada objeto? Como en cualquier tipo de herencia, la cadena de destructores siempre se llama y el destructor de la clase base no tiene que estar siempre definido.
jeffD

11
Una mejor manera de decirlo es que una vez que declaras un destructor, no se implementa automáticamente para ti.
MSN

49

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
};

14
+1. Creo que Herb Sutter también tiene buena información sobre esto: gotw.ca/gotw/031.htm . Es interesante notar que cualquier función virtual pura puede tener una implementación provista, no solo destructores.
Fred Larson

66
Sí, es algo que haces en una entrevista para asustar a tus entrevistadores;)
Dirkgently

1
En realidad, no es tan raro, en mi experiencia.

@Neil Butterworth: ¿Cuál?
Dirkgently

@Dirk: el escenario "cualquier función". No es raro encontrar que se utiliza para implementar un comportamiento común.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.