Visual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance)

孤人 提交于 2019-12-28 15:17:19

问题


The following code generates warning C4250. My question is, what's the best solution to it?

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
}

According to what I've read it should be possible to do this:

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

But, this doesn't actually do anything. The way I've currently solved it is:

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

What's everyone's view on this?


回答1:


I had the same warning for the following code:

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() {};
}; 

This bug report for Visual C++ 2005 in msdn suggests that this is a known bug that was considered not important enough to fix... They suggest to disable the warning in this case by using a pragma. I think it is safe also in your case, but you should use virtual inheritance as shown in the answer by Gal Goldman.




回答2:


Did you try to inherit public virtual from class A? I think it should solve it.


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

The virtual inheritance suppose to solve the ambiguity.




回答3:


[A comment really, but I don't have enough rep...]

David Segonds identified this as a known bug in VS 2005, just tried his example code in VS 2008 and it exhibits the same problem.




回答4:


I think the solution you're using may be the way to go, sorry to say. The only thing I can think of that might help is if you're able to make A's func1 pure virtual. That might not be feasible in your real program, though.




回答5:


Easy solve

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
}


来源:https://stackoverflow.com/questions/469508/visual-studio-compiler-warning-c4250-class1-inherits-class2member-via-d

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!