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:

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.