Visual Studio编译器警告C4250('class1':通过优势继承'class2 :: member')

时间:2009-01-22 15:13:10

标签: c++ visual-studio-2008 warnings multiple-inheritance

以下代码生成警告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(); }
}

每个人对此有什么看法?

5 个答案:

答案 0 :(得分: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的这个bug report表明这是一个已知的错误,被认为不足以修复......他们建议在这种情况下使用pragma禁用警告。我认为在你的情况下它也是安全的,但你应该使用如Gal Galman的答案中所示的虚拟继承。

答案 1 :(得分:8)

您是否尝试从A类继承公共虚拟?我认为它应该解决它。


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

虚拟继承假设解决歧义。

答案 2 :(得分:1)

[评论真的,但我没有足够的代表...]

David Segonds认为这是VS 2005中的一个已知错误,只是尝试了他在VS 2008中的示例代码,它也表现出同样的问题。

答案 3 :(得分:0)

我认为你正在使用的解决方案可能是要走的路,抱歉说。我能想到的唯一可能有帮助的是,如果你能够使A的func1成为纯虚拟的。但是,这在您的真实计划中可能不可行。

答案 4 :(得分:0)

轻松解决

class A
{
  virtual void func1();
}

class B : public A
{
}

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

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

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