0

以下のコードは、この問題を示しています。インターフェイス (C++ 仮想クラス) のみを使用して C++ コンポーネント用の API を作成しようとしています。Base および Derived クラスがあり、対応する IBase および IDerived インターフェイスがありますが、IBase を Derived にキャストしようとするとエラーが発生します。エラー C2594: '型キャスト': 'IBase *' から 'Derived *' へのあいまいな変換

私がやろうとしている Java や C# がまぶたを打たないのは合理的なことのようです。C++でこのようなことを達成する方法はありますか

class IBase
{
public :
  virtual int method_A(void) = 0;
  virtual int method_B(void) = 0;
  virtual int method_C(void) = 0;
};

class IDerived : public IBase
{
public :
  virtual int method_D(void) = 0;
};

class Base : public IBase
{
  int method_A(void) {return 1;};
  int method_B(void) {return 2;};
  int method_C(void) {return 3;};
};

class Derived : public IDerived, private Base
{
public:
  int method_D(void) {return 4;};
};

class HandleDerived
{
public :
  int handle_base(IBase * i_base)
  {
    Derived * derived = (Derived *) i_base;
    return derived->method_D();
  }
};
4

1 に答える 1

3

あなたが見ているのは多重継承です。あなたDerivedは次から派生しています:

  • IDerivedから派生したIBase
  • Baseから派生します。IBase

そのため、関数内でIBaseポインターのようなポインターを処理したい場合、どちらを参照しているのかが明確ではありません: からのもの、または からのもの。Derivedhandle_base()IBaseIDerivedBase

public virtual解決策は、継承を使用することです。ただし、問題についてはC++ FQA Lightを確認する必要があります。

これに関する「Java や C# はまぶたを打たない」というあなたの発言は、的を射ていません。C++ の純粋な仮想基底クラスでさえ、(Java の意味での) インターフェースではなく、依然としてクラスです。つまり、多重継承のケースがまだあります。Java の解決策は、クラスとインターフェースを区別することです。(の 1 つ) C++ の解決策は、仮想継承です。

于 2013-03-11T09:38:05.580 に答える