c++ destructor new delete
Anular identificador después de destructor en C++ 11 (3)
Como la salida del compilador te dice, debes marcar tu método const
class Derived : public Base
{
public:
// ...
virtual int Method() const override
{}
};
para anular el método en la clase base
¿El identificador de anulación después de la declaración del destructor virtual tiene algún significado especial?
class Base
{
public:
virtual ~Base()
{}
virtual int Method() const
{}
};
class Derived : public Base
{
public:
virtual ~Derived() override
{}
virtual int Method() override // error: marked override, but does not override - missing const
{}
};
El uso de un identificador de anulación en el método virtual es útil como comprobación: el compilador informará el error cuando el método virtual de base no esté sobreescrito.
¿Anular el destructor virtual tiene algún significado / función también?
No es una override
que tiene un significado especial, sino el destructor mismo:
10.3 Funciones virtuales
6 / Aunque los destructores no son heredados, un destructor en una clase derivada anula un destructor de clase base declarado virtual; ver 12.4 y 12.5.
Si toma esto junto con la cláusula anterior:
5 / Si una función virtual está marcada con la anulación del especificador de virtudes y no anula una función miembro de una clase base, el programa está mal formado. [Ejemplo:
struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK };
-Final ejemplo]
se puede ver que si se destruye un destructor pero la clase base no tiene un destructor virtual
, el programa está mal formado.
Sí. Si el destructor base no es virtual, la marca de override
hará que el programa no se compile:
class Base
{
public:
~Base()
{}
};
class Derived : public Base
{
public:
virtual ~Derived() override //error: ''~Derived'' marked ''override'' but does
// not override any member functions
{}
};