19

次のようなダイヤモンドの多重継承シナリオがあります。

    A
  /   \
 B     C
  \   /
    D

共通の親である A は、仮想関数 fn() を定義します。
B と C の両方が を定義することは可能fn()ですか?
そうである場合、次の質問は、D が B と C の両方の fn() に明確化せずにアクセスできるかどうかです。これにはいくつかの構文があると思います..
そして、BとCが誰であるかを具体的に知らなくても、Dがそれを行うことは可能ですか? B と C は他のいくつかのクラスに置き換えることができ、D のコードをジェネリックにしたいと考えています。

私がやろうとしているのは、D にその祖先にある fn() のすべてのインスタンスを何らかの方法で列挙させることです。これは、仮想関数という他の手段で可能ですか?

4

6 に答える 6

4

最初の質問、はい、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 つ以上のテンプレート パラメーターを処理するバージョンで上記の例を拡張できますが、クラス テンプレート パラメーターの数には上限 (内部コンパイラー) があると思います。

于 2009-03-05T20:08:56.657 に答える
-1

これに対処するいくつかの質問がすでにあります。質問が不足しているようです。おそらく、検索ボックスは [質問する] ボタンよりも大きくする必要があります。

見る

于 2009-03-05T20:06:10.923 に答える