¿Las interfaces necesitan un destructor virtual, o el autogenerado está bien? Por ejemplo, ¿cuál de los siguientes dos fragmentos de código es el mejor y por qué? Tenga en cuenta que esta es la clase entera. No hay otros métodos, variables, etc. En Java-speak, esta es una "interfaz".Destructores virtuales para las interfaces
class Base
{
public:
virtual void foo() = 0;
virtual ~Base() {}
};
O ...
class Base
{
public:
virtual void foo() = 0;
~Base() {} // This line can be omitted, but included for clarity.
};
edición debido a "NO LO QUE ESTOY BUSCANDO" RESPUESTAS:
exactamente cuáles son las consecuencias de cada ruta. No brinde respuestas vagas como "no se destruirá correctamente". Por favor dime exactamente lo que sucederá Soy un poco nerd de ensamblaje.
Edición 2:
Soy muy consciente de que la etiqueta de "virtual" significa que el destructor no se llama si se suprime a través de un puntero a derivados, pero (creo) a esta pregunta se reduce en última instancia a "¿es seguro omitir ese destructor, porque es realmente trivial?"
Datos 3:
Mi segunda edición es simplemente errónea y desinformación. Por favor, lea los comentarios de personas inteligentes reales para obtener más información.
Tienes la definición de virtual invertido, tipo de. La etiqueta virtual no significa que no se llamará al destructor base si se borra a través de un puntero a derivado, lo que ocurre siempre. En cambio, la etiqueta virtual significa que se llamará al destructor * derived * si elimina el objeto mediante un puntero del tipo de clase * base *. –
@Jordan: Dios mío, creo que tienes razón. –
"Soy un poco nerd de montaje". Eso es desafortunado, ya que C++ no dice nada sobre la generación de ensamblaje. Si desea ver cómo lo maneja un compilador en particular, compile un código y observe el resultado. Y -1 simplemente a tu actitud; no haga una pregunta y diga a todos los que respondieron "usted lo tiene al revés" y desmárquelos. Estás haciendo una pregunta por alguna razón, ¿verdad? – GManNickG