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

前端 未结 5 2084
梦毁少年i
梦毁少年i 2020-12-10 04:59

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
{
}

cla         


        
相关标签:
5条回答
  • 2020-12-10 05:18

    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
    }
    
    0 讨论(0)
  • 2020-12-10 05:23

    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.

    0 讨论(0)
  • 2020-12-10 05:24

    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.

    0 讨论(0)
  • 2020-12-10 05:40

    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.

    0 讨论(0)
  • 2020-12-10 05:42

    [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.

    0 讨论(0)
提交回复
热议问题