当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《VisualStudio编译器警告C4250('class1':通过优势继承'class2::member')》经验,为你挑选了2个好方法。

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

大家对此有什么看法?



1> Dani van der..:

我对以下代码有相同的警告:

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



2> Gal Goldman..:

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

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

虚拟继承假设解决模糊性.


我现在在VS2005中编译了你的代码而没有虚拟它实际上是一个错误,而不是一个警告.随着虚拟它是一个警告.
是的,即使使用虚拟继承,它仍然存在同样的问题(有两个合适的函数可以调用,编译器只选择最"重写"的函数)
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有