我正在开发一个供内部和外部使用的 api。在 Visual Studio 10 上。
我有一个虚拟基类 IA 和一个派生的虚拟基类 IB。我用 A 类实现 IA,然后从 B 派生出 IB 的具体实现。据我了解,这是经典的钻石问题。因此,我将 IA 的 A 继承设为虚拟,并且将 A 的 Bs 继承设为相同。但我收到警告 c4250(warning C4250: 'B' : inherits 'A::A::AnInt' via dominance)
- 虽然此警告接缝表明编译器正在执行我想要的操作,但我对警告感到不舒服,并希望确保#pragma 退出是安全的,或者存在一些我不知道的问题。
编码
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,消费开发人员将无法更改相关抽象类。您应该避免设计带有继承的接口,还是继续让派生类使用虚拟继承。