複数の継承と仮想継承を回避するために、テンプレート継承を使用することを選択しました。私の目標は、さまざまな子(4世代または5世代、または私が制御しない継承)に、派生するものに関係なく、共通の関数呼び出しを持たせることです。
私の解決策は、テンプレートの継承を次のように挿入することです。
template <typename BASE>
class common_call : public BASE {
public:
void foo() { /*implementation independent of base*/ }
};
class child1 : public common_call <base1> {};
class child2 : public common_call <base2> {};
これには、baseのコンストラクターを呼び出すという問題があります。クラスbase1とbase2(私が作成したものではありません)には、初期化リストで呼び出す必要のある異なるコンストラクターがあります。common_callテンプレートはこれらのコンストラクターについて何も知りませんが、子クラスは現在直接継承しているので知っています。
私がこれを行う方法はありますか?
class child3 : public common_call<base3>{
public:
child3(param1, param2) : base3(param2) {/*do things here*/}
};
可能であれば、ベースのタイプごとに部分的なテンプレートの特殊化を行わないようにしています。