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.