2010-12-27

アクセス宣言について解説すべきか

アクセス宣言という項目を独立して立てて、解説をすべきだろうか。

アクセス宣言は、batavia会議の結果、削除された。deprecatedではない。削除されたのだ。したがって、アクセス宣言という用語自体が、もはやC++には相応しくない。

アクセス宣言が提供していた機能は、using宣言で行える。たとえば、以下のようなクラスがあるとして、

class Base
{
    int value ;
public :
    int get() const { return value ; }
    void set( int value ) { this->value = value ; }
} ;

このBaseクラスからprivateで派生したいとする。ただし、Base::getだけはpublicで提供したい。その場合に、using宣言を使って、以下のように書くことができる。

class Derived : private Base
{
public :
    using Base::get ;
} ;

これにより、Base::valueやBase::setをprivateにしながら、Base::getだけをpublicにすることができる。

現実に必要になる例としては、operator newやoperator deleteのオーバーロードをしている基本クラスからprivate派生したクラスを、クラス外からnewさせたい場合などが当てはまる。

また、オーバーロード解決の候補関数にしたい場合も考えられる。

struct Base
{
    void f( int ) { }
} ;

struct Derived : Base
{
    void f( double ) { }
} ;

int main()
{
    Derived d ;
    d.f( 0 ) ; // call Derived::f(double)
}

クラスメンバーの名前探索では、派生クラスのメンバーに、目的の名前が見つかった場合は、その時点で名前探索を打ち切る。つまり、基本クラスのメンバー名が見つかることはない。そのため、Base::fが呼ばれることはない。これも、using宣言を使って解決できる。

問題は、この機能は、一般にあまり知られているとは言いがたいし、おそらく現実のプログラミングでは、知らなくても全く問題ないだろう。using宣言で基本クラスのメンバー名を派生クラスのスコープの持ってくるというのは、まず必要にならないからだ。

これを、わざわざ独立して解説すべきなのか。

No comments: