una - subprogramas virtuales c++
¿Cuál es el propósito del destructor virtual puro? (4)
El compilador no obliga a la clase Child a implementar un destructor cuando su Base tiene un destructor virtual puro.
No, el compilador genera un destructor predeterminado para la clase Child (que a su vez llama a la implementación del destructor virtual puro de la clase Base) en caso de que no defina uno explícitamente.
Posibles duplicados:
¿Bajo qué circunstancias es ventajoso dar una implementación de una función virtual pura?
¿Por qué necesitamos un destructor virtual puro en C ++?
El compilador no obliga a la Child class
a implementar un destructor cuando su Base
tiene un destructor virtual
puro.
struct Base
{
virtual void foo () = 0;
virtual ~Base() = 0;
};
Base::~Base() {} // necessary
struct Child : Base
{
void foo() {}
//ok! no destructor needed to create objects of ''Child''
};
Lo gracioso es eso; El compilador obliga a la Base
a definir un cuerpo destructor. Lo que se entiende . ( Demo para referencia)
Entonces, ¿cuál es el propósito de tener un destructor virtual
puro en la clase Base
? (¿Es solo para rechazar la Base
creando objetos?)
A veces, una clase base abstracta no tiene métodos virtuales (= a menudo se llama "mixin") o ningún método (= a menudo se llama una "etiqueta de tipo").
Para forzar que esas clases se usen como clases base abstractas, al menos un método debe ser virtual, ¡pero las clases no tienen métodos virtuales ! Así que hacemos el destructor puro virtual en su lugar.
Hace que la clase sea abstracta. La existencia de al menos un método virtual puro es suficiente para que una clase sea abstracta.
Si no tiene ninguna otra función virtual pura en Base
, tiene la opción de hacer que el destructor sea simplemente virtual para que la clase base aún sea abstracta.
En realidad , obliga a la clase derivada a implementar un destructor, pero el compilador lo hará por usted si no proporciona uno.
Ok, tal vez podría haberlo expresado mejor. El segundo párrafo es en respuesta a:
El compilador no obliga a la
Child class
a implementar un destructor cuando suBase
tiene un destructorvirtual
puro.
Probablemente quise decir que un destructor virtual (puro o no) hace que la clase derivada también tenga un destructor virtual, tanto si lo escribe como si lo hace el compilador.