web-dev-qa-db-ja.com

C ++ 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
    {}
};

仮想メソッドで識別子のオーバーライドを使用すると、チェックとして役立ちます。ベース仮想メソッドが実際にオーバーライドされない場合、コンパイラはエラーを報告します。

仮想デストラクタのオーバーライドにも意味/機能はありますか?

特別な意味を持つのはoverrideではなく、デストラクタ自体です:

10.3仮想関数

6 /デストラクタは継承されませんが、派生クラスのデストラクタは、仮想と宣言された基本クラスのデストラクタをオーバーライドします。 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 
}; 

—例の終了]

デストラクタがoverrideとマークされているが、基本クラスにvirtualデストラクタがない場合、プログラムは不正な形式であることがわかります。

40
John Dibling

はい。ベースデストラクタが仮想でない場合、overrideマーキングによりプログラムはコンパイルされません。

class Base
{
public:
    ~Base()
    {}
};

class Derived : public Base
{
public:
    virtual ~Derived() override //error: '~Derived' marked 'override' but does
                                //        not override any member functions
    {}
};
41
Mankarse