最初の質問、はい、B と C はfn()
仮想関数として定義できます。2 番目に、D はもちろんスコープ演算子を使用してアクセスできますB::fn()
:: C::fn()
3 番目の質問: 継承リストでそれらを定義する必要があるため、D は少なくとも B と C を知っている必要があります。テンプレートを使用して、B と C の型を開くことができます。
class A
{
public:
virtual ~A() {}
virtual void fn() = 0;
};
class B: public A
{
public:
virtual ~B() {}
virtual void fn(){ std::cout << "B::fn()" << std::endl; }
};
class C: public A
{
public:
virtual ~C() {}
virtual void fn(){ std::cout << "C::fn()" << std::endl; }
};
template <typename TypeB, typename TypeC>
class D: public TypeB, public TypeC
{
public:
void Do()
{
static_cast<TypeB*>(this)->fn();
static_cast<TypeC*>(this)->fn();
}
};
typedef D<B, C> DInst;
DInst d;
d.Do();
D が継承するすべてのクラスのすべての fn() 関数を自動的に列挙したいという要望について: MPL に頼らずにそれが可能かどうかはわかりません。少なくとも、3 つ以上のテンプレート パラメーターを処理するバージョンで上記の例を拡張できますが、クラス テンプレート パラメーターの数には上限 (内部コンパイラー) があると思います。