virtuales que puro puras polimorfismo objeto modificador herencia funciones entre ejercicios diferencia c++

puro - En caso de que las ''interfaces'' de C++ tengan un destructor virtual



polimorfismo puro c++ (6)

Posible duplicado:
Destructores para clases similares a la interfaz C ++

Considere un ejemplo simple de una clase abstracta de C ++, utilizada para modelar una interfaz:

class IAnimal { virtual void walk()=0; virtual ~IAnimal(){} };

¿Es mejor tener el destructor, o no? No creo que el destructor pueda ser puramente virtual, al menos mis pruebas dan errores de enlazador, ¿debería incluirse un destructor vacío?

EDITAR: lo siento, error tipográfico. Es un destructor, no un constructor.


Creo que debería ser un destructor virtual puro para las interfaces, y todos los demás métodos son también virtuales puros.


Esto depende de si tiene la intención de administrar la vida útil de los objetos polimórficamente, usando punteros a la clase de interfaz.

Si lo hace, entonces el destructor debe ser virtual, para eliminar correctamente los objetos. Eliminar un puntero de clase base que no tiene un destructor virtual no es válido y proporciona un comportamiento no definido.

Si no lo hace, entonces debe hacer cumplir esto haciendo que el destructor no sea virtual y esté protegido, por lo que solo se pueden eliminar las clases derivadas.


La única razón para no hacer el destructor virtual sería guardar el espacio necesario para el vptr . Como necesita el vptr todos modos porque tiene otra función virtual, haría el destructor virtual.


Mira this artículo de Herb Sutter

Especialmente esta parte:

Para el caso especial del destructor solamente:

Directriz # 4: Un destructor de clase base debe ser público y virtual, o protegido y no virtual.

Esto supone que la clase base es una clase de ''interfaz'' como debería ser en su mayoría.


Siempre debe usar un destructor virtual con interfaces. Caso en punto:

IAnimal* animal = new Lion(); delete animal;

Ahora, ¿qué destructor va a usar? Definitivamente no es el destructor del León porque la interfaz no sabe sobre el destructor de Lion .

Por lo tanto, tenga esto si su interfaz no tiene administración de memoria:

virtual ~IAnimal(){}


probablemente se deba incluir un constructor vacío ya que un uso típico de una interfaz implica poner un puntero a un objeto concreto en un contenedor, que de lo contrario llamaría al destructer incorrecto y no limpiaría la memoria correctamente. así que si alguien va a eliminar los objetos derivados a través de un puntero a Ianimal creará un destructor virtual, sino hará que su destructor no sea virtual y esté protegido. hacer que tu destructor sea virtual puro probablemente no sea una buena idea, ya que obliga a los implementadores de clases derivadas a anular tu destructor, aunque tal vez no quieran hacer nada