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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.