派生クラスから、基底クラスにアクセスする時の慣用句
C++には、Smalltalk/Javaのsuperに相当する予約語がありません。
ですが、これと同等のことが、typedefを使うことで可能になります。
派生クラスで、基底クラスのクラス名をsuperという名でtypedefします。
これを派生クラスでは必ず書くようにします。
そして、派生クラスから基底クラスのメンバにアクセスする時には、必ず、super::XXX() と書くようにします。
こうしておけば、開発中に継承関係が変わったとしても、派生クラス内のtypedef定義を修正するだけで済みます。実際に呼び出しを行っている部分に、修正を加える必要はありません。
struct Foo
{
virtual ~Foo(){}
virtual void f(){ cerr << "Foo::f()" << endl;}
};
struct Bar : public Foo
{
typedef Foo super;
virtual ~Bar(){}
virtual void f()
{
super::f(); // 基底クラスの f() を呼ぶ
// 以下で Bar::f() 固有の処理
cerr << "Bar::f()" << endl;
}
};
参照:D&E:13.6 に、この機能が何故導入されなかったかの経緯が載っています。
備考:superでなくとも、baseなり、inheritedなりお好みで。
ですが、これと同等のことが、typedefを使うことで可能になります。
派生クラスで、基底クラスのクラス名をsuperという名でtypedefします。
これを派生クラスでは必ず書くようにします。
そして、派生クラスから基底クラスのメンバにアクセスする時には、必ず、super::XXX() と書くようにします。
こうしておけば、開発中に継承関係が変わったとしても、派生クラス内のtypedef定義を修正するだけで済みます。実際に呼び出しを行っている部分に、修正を加える必要はありません。
struct Foo
{
virtual ~Foo(){}
virtual void f(){ cerr << "Foo::f()" << endl;}
};
struct Bar : public Foo
{
typedef Foo super;
virtual ~Bar(){}
virtual void f()
{
super::f(); // 基底クラスの f() を呼ぶ
// 以下で Bar::f() 固有の処理
cerr << "Bar::f()" << endl;
}
};
参照:D&E:13.6 に、この機能が何故導入されなかったかの経緯が載っています。
備考:superでなくとも、baseなり、inheritedなりお好みで。
2005年08月03日(水) 09:56:45 Modified by ladder4deepcxx