2011-04-10 16 views
9

Tengo un escenario en el que estoy escribiendo un código orientado a objetos bastante profundo, con varias capas de clases base abstractas, y me pregunto si tengo que declarar explícitamente un destructor para cada uno.Con destructores virtuales, ¿necesito declarar explícitamente un destructor virtual para cada subclase?

¿El compilador generará uno predeterminado que ya sea virtual, o tendré que decírselo?

+0

Observo que, en un comentario a continuación, también se pregunta si necesita _definir_ un destructor para cada subclase. Y que la respuesta es no. –

Respuesta

9

El destructor predeterminado no es virtual, pero si declara el destructor de su clase base como virtual, los destructores de las subclases serán reemplazados y, por lo tanto, también serán virtuales incluso sin declararlos explícitamente.

El compilador GCC de GNU incluso da una advertencia si tiene una jerarquía de clases y su clase base no declara que el destructor sea virtual porque lo más probable es que lo desee.

+2

Probablemente haya querido decir destructor, no constructor. – GManNickG

+0

Derecha, gracias, se arregló. – trenki

+1

gcc solo emite una advertencia * si * tiene un método virtual * pero * el destructor no es virtual. Puedes heredar perfectamente de una clase sin ningún método virtual, lo cual es útil para la meta-programación :) –

2

En general, si alguna función se declara virtual en la clase base, no hay necesidad de declararla explícitamente como virtual en subclases. Sin embargo, es una buena práctica.

Declarar destructores en subclases como virtuales explícitamente no le da ninguna ventaja seria, por lo que si no desea escribir uno más virtual, no lo haga.

+0

¿Debería incluir una definición en la implementación? Eso resultaría en una gran cantidad de destructores vacíos abarrotando mi código. – Alex

+0

@Alex no, puede omitirlo. – UmmaGumma

3

La respuesta es no. El único requisito relevante aquí es que las clases con un vtable (, es decir,, con al menos una función virtual) deben tener al menos un destructor virtual en algún lugar de su cadena de herencia. Normalmente, esto significa que su clase base fundamental proporcionará un destructor virtual vacío.

Cuestiones relacionadas