11

次のコードは、警告 C4250 を生成します。私の質問は、それに対する最善の解決策は何ですか?

class A
{
  virtual void func1();
}

class B : public A
{
}

class C : public A
{
  virtual void func1();
}

class D : public B, public C
{
}

int main()
{
  D d;
  d.func1(); // Causes warning
}

私が読んだことによると、これを行うことができるはずです:

class D : public B, public C
{
  using B::func1();
}

しかし、これは実際には何もしません。私が現在それを解決した方法は次のとおりです。

class D : public B, public C
{
  virtual void func1() { B::func1(); }
}

これについてのみんなの見解は?

4

5 に答える 5

20

次のコードに対して同じ警告が表示されました。

class Interface
{
public:
    virtual void A() = 0;
};

class Implementation : public virtual Interface
{
public:
    virtual void A() {};
};

class ExtendedInterface : public virtual Interface
{
    virtual void B() = 0;
};

class ExtendedImplementation : public ExtendedInterface , public Implementation
{
public:
    virtual void B() {};
}; 

msdn の Visual C++ 2005 のこのバグ レポートは、これが既知のバグであり、修正するほど重要ではないと考えられていることを示唆しています...この場合、プラグマを使用して警告を無効にすることを提案しています。あなたの場合も安全だと思いますが、Gal Goldman の回答に示されているように、仮想継承を使用する必要があります。

于 2009-02-01T07:29:20.220 に答える
8

クラス A から public virtual を継承しようとしましたか? 解決すればいいと思います。


    class B :public virtual A;
    class C :public virtual A;
    class D : public virtual B, public virtual C;

仮想継承は、あいまいさを解決することを想定しています。

于 2009-01-22T15:41:23.743 に答える
1

[本当にコメントですが、担当者が足りません...]

David Segonds は、これが VS 2005 の既知のバグであると特定し、VS 2008 で彼のサンプル コードを試したところ、同じ問題が発生しました。

于 2014-08-03T21:11:41.693 に答える
0

申し訳ありませんが、あなたが使用しているソリューションが進むべき道かもしれません。私が考えることができる唯一のことは、Aの func1 を純粋に仮想化できる場合です。ただし、実際のプログラムでは実行できない場合があります。

于 2009-01-22T15:54:32.717 に答える