Идентификатор переопределения после деструктора в С++ 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
    {}
};

чтобы переопределить метод в базовом классе