明示的な仮想関数オーバーライド


概要

C++03までのクラス定義では、意図的に仮想関数のオーバーライドを禁止する機能や、 オーバーライドしたいのに関数の宣言ミスなどによりオーバーライドされていない事を検知する機能がなかった。 また、クラス自体を意図的に継承させないといった機能も不足していた。 C++11では、クラス定義の際に使用できる新たなキーワードとして、"final", "override" が追加されている。 このキーワードはクラス定義時のみのものであり、そのほかの定義や宣言などでこれらの名前を使用しても ill-formed にはならい。

まずは、キーワード"final"について説明する。このキーワードをクラス定義のクラス名の後ろに指定することで、 そのクラスを継承不可に設定することができる。

class base { };
class final final : public Base { };        //OK クラスfinalに対し、継承不可に指定をする。
class ExtendFinale : public final { };      //error クラスfinalは継承不可

また、このキーワードを仮想関数宣言の後ろに指定することもできる。この場合、指定された仮想関数はオーバーライド不可に設定される。

class base {
public:
    virtual void func() = 0;
};

class derive : public base {
public:
    void func() final { }                   //OK 仮想関数funcをオーバーライド不可に指定する。
};

class override : public derive {
public:
    void func() { }                         //error 仮想関数funcは、クラスderiveにてオーバーライド不可となっている。
};

次に、キーワード"override"について説明する。このキーワードを仮想関数宣言の後ろに指定することで、仮想関数をオーバーライドすることを意味する。 このキーワードを指定したにも関わらずオーバーライドされない場合には ill-formed となる。 また、仮想関数に対する "final", "override" は同時に指定することも可能である。

class base {
public:
    virtual void func(int x) {}
};

class derive {
public:
    void fund(int x) override {}            //error 関数名が異なるためオーバーライドになっていない 
    void func() override {}                 //error 引数が異なるためオーバーライドになっていない
    void func(int x) override {}            //OK オーバーライドする
    void func(int x) final override {}      //OK オーバーライド、かつ継承先でオーバーライド不可に指定する.
}

results matching ""

    No results matching ""