Идентификатор переопределения после деструктора в С++ 11
Имеет ли какой-либо особый смысл идентификатор переопределения после объявления виртуального деструктора?
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
{}
};
Использование идентификатора переопределения в виртуальном методе полезно в качестве проверки: компилятор будет сообщать об ошибке, когда виртуальный метод базы данных не будет действительным, но не переопределит.
У переопределения на виртуальном деструкторе тоже есть смысл/функция?
Ответы
Ответ 1
Это не override
имеет особое значение, но сам деструктор:
10.3 Виртуальные функции
6/Несмотря на то, что деструкторы не наследуются, деструктор в производном class переопределяет деструктор базового класса, объявленный виртуальным; см. 12.4 и 12.5.
Если вы примете это в сочетании с предыдущим предложением:
5/Если виртуальная функция отмечена переопределением virt-specifier и не переопределяет функцию-член базового класса, программа плохо сформирован. [Пример:
struct B {
virtual void f(int);
};
struct D : B
{
void f(long) override; // error: wrong signature overriding B::f
void f(int) override; // OK
};
-end пример]
вы можете видеть, что если деструктор отмечен override
, но базовый класс не имеет деструктора virtual
, программа плохо сформирована.
Ответ 2
Да. Если базовый деструктор не является виртуальным, то маркировка override
приведет к невозможности компиляции программы:
class Base
{
public:
~Base()
{}
};
class Derived : public Base
{
public:
virtual ~Derived() override //error: '~Derived' marked 'override' but does
// not override any member functions
{}
};
Ответ 3
Как сообщает вам компилятор, вы должны отметить метод const
class Derived : public Base
{
public:
// ...
virtual int Method() const override
{}
};
чтобы переопределить метод в базовом классе