2013-04-06

C++11のfinalとoverride

C++11には、finalとoverrideがある。クラスにはfinalを指定できる。virtual関数にはfinalとoverrideを指定できる。

クラスにfinalを指定すると、そのクラスを基本クラスに指定できなくなる。

struct final_class final { } ;
// エラー、final_classは基本クラスに指定できない
struct error : final_class { } ;

virtual関数にfinalを指定すると、そのvirtual関数をそれ以上オーバーライドできなくなる。

struct base
{
    virtual void f() { } 
} ;

struct derived : base
{
    virtual void f() final { } 
} ;

struct error : derived
{
    // エラー
    virtual void f() { } 
} ;

virtual関数にoverrideを指定すると、そのvirtual関数がオーバーライドしていない場合、エラーとなる。

struct base
{
    virtual void virtual_function() { }
} ;

struct typo_error : base
{
    // エラー、オーバーライドしていない
    virtual void virtal_function () override { }
} ;
struct base
{
    void virtual_function() { }
} ;

struct non_virtual_error : base
{
    // エラー、オーバーライドしていない
    virtual void virtual_function () override { }
} ;

これにより、しょうもないtypoをコンパイル時に検出できる。

ドラフトではもうひとつ、基本クラスのスコープのメンバー名を派生先のクラスで隠している(hiding)ことを明示的に指定するための機能があったのだが、いろいろな理由で消された。これはメンバー関数以外のメンバーにも適用する必要があるため、文法の問題がややこしく、時間がなかったのだ。

No comments: