仮想デストラクタ宣言後のオーバーライド識別子には特別な意味がありますか?
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
ではなく、デストラクタ自体です:
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
デストラクタがない場合、プログラムは不正な形式であることがわかります。
はい。ベースデストラクタが仮想でない場合、override
マーキングによりプログラムはコンパイルされません。
class Base
{
public:
~Base()
{}
};
class Derived : public Base
{
public:
virtual ~Derived() override //error: '~Derived' marked 'override' but does
// not override any member functions
{}
};