2011-04-29 10 views
14

Tengo dos clases:clase tiene funciones virtuales y destructor no virtual accesible

errores
class A { 
public: 
    virtual void somefunction() = 0; 
}; 

class B : public A { 
public: 
    B(); 
    ~B(); 
    void somefunction(); 
}; 

B::B() {} 

void B::somefunction() { 
    // some code 
} 

Pero con g ++ me sale:

class A has virtual functions and accessible non-virtual destructor 
class B has virtual functions and accessible non-virtual destructor 

No tengo idea de lo que es este error ... En algún lugar de los blogs, leí que es una advertencia del compilador. ¿Cómo puedo solucionar el problema?

Respuesta

16

Esto ocurre porque su clase base A no tiene un destructor virtual. Por ejemplo, si usted ha tenido este código:

int main() 
{ 
    A* a = new B; 
    delete a; 
} 

Entonces la llamada delete a no sería capaz de llamar B 's destructor porque A' s no es virtual. (Perdería todos los recursos de B.) Puede read more about virtual destructors here.

Agregue un destructor virtual a su clase base y debería estar bien. clase

class A 
{ 
public: 
    virtual void somefunction() = 0; 
    virtual ~A() = 0; 
} 
+1

intenté esto pero da una referencia indefinida a A :: ~ A() – SPB

+2

@SPB Significa que no pudo encontrar una implementación de su destructor. Escribe uno trivial si no tienes nada que destruir realmente. 'A :: ~ A() {}' debería hacerlo. – zneak

+0

ya me ayudó ... gracias ... nuestra explicación es buena. – SPB

6

dan una:

virtual ~A() { } 

De esa manera, las clases derivadas tales como B todavía tendrá su destructor personalizada llamada si delete ellos a través de un A*.

3

Si una clase tiene funciones virtuales, entonces su destructor también debe ser virtual. El tuyo tiene un destructor accesible pero no es virtual.

2

Como regla del pulgar (en mi humilde opinión) o en el corto destructor en la clase base tiene que ser pública y virtual o protegido no virtual para evitar que la memoria leaks.by hacerlo las destructores de la clase derivada llegar llamado y esto evita la pérdida de memoria cuando se borra la referencia puntero/referencia que contiene dirección/referencia.

Cuestiones relacionadas