struct Base { virtual void f( int ) ; virtual void f( float ) ; } ; struct Derived explicit : Base { void f( int ) override new ; } ;
Derived::f(int)には、overrideとnewが両方必要である。virtual関数であるBase::f(int)をオーバーライドしているので、overrideが必要になる。また、Base::f(float)という名前を隠しているので、newが必要になる。どちらが欠けても、コンパイルエラーになる。
ちなみに、派生クラスでベースチェック(explicitキーワード)を使う場合、基本クラスはうかつにメンバーを追加できなくなる。なぜならば、メンバーを追加するということは、派生クラスの前提を変えるということなのだから。
struct Base { virtual void f( int ) ; } ; struct Derived explicit : Base { void f( int ) override; } ;
このようなクラスがあったとして、もし、Baseクラスに、fという名前のオーバーロード関数を付け加えた場合、Derivedクラスの方も、修正しなければならなくなる。
もちろん、これは当然である。そのための明示的なベースチェック機能なのだから。
No comments:
Post a Comment