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