He definido una interfaz en C++, es decir, una clase que solo contiene funciones virtuales puras.Advertencia del compilador de GNU "la clase tiene funciones virtuales pero destructor no virtual"
quiero prohibir explícitamente a los usuarios de la interfaz para eliminar el objeto a través de un puntero a la interfaz, por lo que declaré un destructor protegido y no virtual para la interfaz, algo así como:
class ITest{
public:
virtual void doSomething() = 0;
protected:
~ITest(){}
};
void someFunction(ITest * test){
test->doSomething(); // ok
// deleting object is not allowed
// delete test;
}
El GNU compilador me da una advertencia diciendo:
clase 'ITest' tiene funciones virtuales, pero destructor no virtual
Una vez que el destructor está protegido, ¿cuál es la diferencia al tenerlo virtual o no virtual?
¿Cree que esta advertencia se puede ignorar o silenciar de forma segura?
Creo que es solo una advertencia, y el caso anterior es excepcional. En general, si tiene funciones virtuales, probablemente también deba tener un destructor virtual. –
Acepto que es un error menor que la advertencia no se suprima en presencia de un destructor protegido. Las otras respuestas que mencionan la eliminación por una clase derivada son válidas, pero es mucho menos probable que sean problemáticas que los destructores virtuales que faltan regularmente. –
¡Gracias por el enlace al artículo de Herb! –