アクセス宣言という項目を独立して立てて、解説をすべきだろうか。
アクセス宣言は、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:
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.