2012-07-15 26 views
26

En C++ 11, estamos en condiciones de declarar un destructor ser generadas automáticamente:defecto destructor virtual puro

struct X { 
    virtual ~X() = default; 
}; 

También, podemos declarar un destructor ser puro virtual:

struct X { 
    virtual ~X() = 0; 
}; 

Mi pregunta es: ¿cómo declarar que el destructor sea ambos autogenerados y puros virtuales? Parece que la sintaxis siguiente no es correcta:

struct X { 
    virtual ~X() = 0 = default; 
}; 

Tampoco es éste:

struct X { 
    virtual ~X() = 0, default; 
}; 

Tampoco éste:

struct X { 
    virtual ~X() = 0 default; 
}; 

EDIT: Algunas aclaraciones sobre el propósito de la pregunta . Básicamente quiero una clase vacía vacía para ser clase base no instanciable, pero la clase derivada es instanciable, entonces la clase debe tener un destructor virtual puro. Pero, por otro lado, no deseo proporcionar la definición en un archivo .cpp. Entonces necesito algún tipo de mecanismo equivalente a default. Me pregunto si alguien tiene una idea para resolver el problema.

+2

Se puede hacer 'Virtual ~ X() = 0 {}'? Ahora piensa de nuevo en lo que estás tratando de hacer. – Xeo

+4

@Xeo: Sí, puedes. Pero no con esa sintaxis; debe proporcionar una implementación no en línea. Cualquier función virtual pura puede tener una implementación predeterminada, lo que simplemente significa que las clases derivadas no abstractas * deben * implementar la función, pero pueden llamar a la implementación predeterminada de los padres como parte de su implementación. – JohannesD

+1

@JohannesD: Lo sé, vea mi comentario en la respuesta de Michal, pero '= default' es básicamente' {} 'en la clase (si no tiene miembros). – Xeo

Respuesta

39

Para definir un método virtual puro, necesita una definición separada de la declaración.

Por lo tanto:

struct X { 
    virtual ~X() = 0; 
}; 

X::~X() = default; 
+0

Aquí hay un [enlace a un ejemplo de Ideaone] (http://ideone.com/Y4iPA) que compila con éxito. –

+0

maldición, me ganaste mientras recibía mi copia de C++ efectivo (donde esto se muestra usando la sintaxis anterior) –

+3

¡Esta respuesta es incorrecta! Aún debe colocar la línea 'X :: ~ X() = predeterminada; 'en el archivo .cpp; de lo contrario, habrá un error de enlace de' 'definición múltiple ''. –

Cuestiones relacionadas