2012-01-23 9 views
8
/*Child is inherited from Parent*/ 
class Parent { 
    public: 
    Parent() //Constructor 
    { 
     cout << "\n Parent constructor called\n" << endl; 
    } 
    protected: 
    ~Parent() //Dtor 
    { 
     cout << "\n Parent destructor called\n" << endl; 
    } 
}; 

class Child : public Parent 
{ 
    public: 
    Child() //Ctor 
    { 
     cout << "\nChild constructor called\n" << endl; 
    } 
    ~Child() //dtor 
    { 
     cout << "\nChild destructor called\n" << endl; 
    } 
}; 

int main() 
{ 
    Parent * p2 = new Child;   
    delete p2; 
    return 0; 
} 

Si hago el destructor virtual Parent, entonces obtengo un error, entonces ¿para qué sirve la destrucción virtual de un destructor?¿Hay algún uso para hacer un destructor protegido virtual?

+1

Tal vez deberíamos comenzar con "¿por qué harías dtor protegido?". –

+4

¿Por qué alguna vez quisiste hacer el destructor virtual? ¿No debería * usted * conocer el propósito? Un destructor protegido significa que los objetos no se deben destruir a través de punteros base, por lo que el código en 'main' es completamente incorrecto. – thiton

+0

Ver http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors – user998692

Respuesta

17

Solo por dar un ejemplo: supongamos que tiene una clase base que implementa el recuento de referencias. Tiene un método addRef y release y desea que su objeto se destruya, si (y solo si) el contador interno llega a cero mediante una llamada al release.

Por lo tanto, primero quiere proteger su destructor (ya que solo quiere destruir el objeto desde dentro de relase).

Si planea derivar de su clase, también desea tener su destructor virtual, ya que necesita un destructor virtual siempre que quiera destruir un objeto secundario a través de un puntero a una clase base (gracias @sharptooth para la sugerencia ...)

+2

No, necesita un destructor virtual independientemente de si las clases derivadas requieren alguna destrucción adicional, de lo contrario, el comportamiento no está definido. – sharptooth

+0

@sharptooth Bien, no pensé en esto. Solucionado, gracias por señalarlo! – MartinStettner

+0

Vi un código que usa este truco para forzar a que toda la destrucción pase por la función de envoltura estilo C amigo (definida por clase derivada). Supongo que el intento fue similar pero se perdió bajo mantenimiento. – Muxecoid

4

protected: Base::~Base(); debe ser virtual, al menos, si (el plan de) la eliminación de los objetos derivados de Base dentro Base o una clase derivada de Base.

+0

borrar esto; para cualquier objeto infantil desconocido lo tengo gracias – tusharfloyd

+0

@ user1085822: Entonces, me está agradeciendo sin aceptar mi respuesta. ¿Qué estás tratando de decirme? – bitmask

+0

¿No debería ser solo – ksb

5

Sí, si tiene intención de hacer delete this en class Parent funciones de miembro que es muy común al implementar IUnknown::Release() en objetos COM.

+0

Agradable. Y para el caso, cualquier otra clase derivada si 'depete pBase;' atacado. – iammilind

Cuestiones relacionadas