虚拟继承和委托实施
Virtual inheritance and delegated implementation
我正在开发一个内部和外部使用的api。在Visual Studio 10。
我有一个虚拟基类IA和一个派生的虚拟基类IB。我用类a实现IA,然后从B派生IB的具体实现。据我所知,这就是经典的菱形问题。因此,我将IA的A继承设为虚拟的,而将A的B继承设为相同的。但我得到了一个警告c4250 (warning C4250: 'B' : inherits 'A::A::AnInt' via dominance)
- 虽然这个警告表明编译器正在做我想做的事情,但我对这个警告感到不舒服,想确保#pragma out是安全的,或者有一些我不知道的问题
代码
class IA
{
public:
virtual int AnInt() = 0;
};
class A : virtual public IA
{
public:
virtual int AnInt()
{
return 3;
}
};
class IB : virtual public IA
{
public:
virtual int AnInt2() = 0;
};
class B : public A, public IB
{
public:
int AnInt2()
{
return 4;
}
};
问题的第二部分。如果您正在创建一个api,那么使用该api的开发人员将无法更改有问题的抽象类。应该避免使用继承来设计接口,还是继续让派生类使用虚拟继承。
这个问题以前已经讨论过了。Dani van der Meer的回答专门针对这个问题。自2005年以来,它已在Visual Studio中作为"不会修复"错误报告提交。
如果你不喜欢禁用警告,你可以随时明确功能选择。
class B : public IB, public A
{
public:
+ int AnInt()
+ {
+ return A::AnInt();
+ }
int AnInt2()
{
return 4;
}
};
我也有类似的问题
我正在使用MSVC2010
我最终创建了一个单独的文件来指定委派(因为这对所有派生的都是常见的),以克服警告对它的任何评论,这是坏的或不是赞赏
class iCommon //pure virtual
{
virtual void Foo()=0;
}
class iDerived: virtual iCommon //pure virtual... intended to allow testing with mocks
{
virtual void Bar()=0;
}
class CommonImpl : virtual public iCommon
{
virtual void Foo(){/* do common stuff*/}
}
class Derived: virtual public CommonImpl,virtual public iDerived
{
//implement the derived functionality
virtual void Bar(){/* this method is not common*/}
//now load the file to avoid compiler warnings
#include "CommonImpl.delegate"
}
"CommonImpl.delegate"的内容
virtual void Foo() overload {return CommonImpl::Foo();}
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 大小虚拟继承中的派生类
- 删除C++继承中虚拟类成员的代码重复
- 重写虚拟函数和继承
- C++ 多级虚拟继承编译问题
- 如何正确获得虚拟继承?
- 编译时继承类中的隐式虚拟与显式虚拟
- 钻石继承虚拟成员铸造与指针
- CPP 继承虚拟方法解析顺序
- 关于C 接口(纯虚拟类)/多重继承/虚拟继承的设计Qustion
- 继承虚拟类C 的派生类
- 多个继承/虚拟函数
- 不能从具有虚拟继承(C++虚拟继承)的类派生
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 为什么我不能继承虚拟基的构造函数?
- C++继承虚拟函数崩溃
- c++多重继承/虚拟继承
- 派生类的成员函数是否从基类继承虚拟性?
- 继承虚拟函数的类的boost::optional失败的原因
- c++继承虚拟函数