2010-11-24

hidingという概念は難しい

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: