派生クラスから、基底クラスにアクセスする時の慣用句

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なりお好みで。
2005年08月03日(水) 09:56:45 Modified by ladder4deepcxx




スマートフォン版で見る