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