以下のようなクラス群を考えます.
class nil_t{}; templateclass A : public Super { }; template class B : public Super { }; template class C : public Super { };
Aのテンプレート引数T1とT2,Bのテンプレート引数T,Cのテンプレート引数T1とT2は各々のクラスに必要なテンプレート引数だと思ってください.上のA,B,Cに共通する事としてテンプレート引数で自身の親クラスを指定できるということが挙げられます.また,そのデフォルトはnil_tという空のクラスに指定されています.
さて,クラスDをクラスCから継承してみます.
class D : public C{ };
何の問題も無いですね?一つだけ,Cが暗黙のうちにnil_tから継承されているということには注意が必要です.
さて,では以下のように書くとどうなるでしょうか?
class D : public C> { };
まず,B
となれば,後は以下のように自由に継承の鎖を生成できるということは簡単に想像できるかと思います.
class D : public B> > { };
上の例ではnil_t → C
このChained Inheritanceを利用する目的とその実例として,自分が知っている範囲内では
- (インターフェースやポリシーを規定するような)空クラスを多数継承する際に,EBCOが効かない環境での空間のオーバーヘッドの削減を図る -> boost::operators
- 継承によってクラスの構造(データメンバ)の構築を行う -> boost::property
あたりが挙げられるでしょうか?珍しいテクニックではあると思います.