我有一个基类“Base”,它是一个纯虚拟类:
class Base {
public:
virtual void A() = 0;
virtual void B() = 0;
virtual ~Base() { } // Eclipse complains that a class with virtual members must have virtual destructor
};
我还有 2 个其他类,其中一个实现 A(),另一个实现 B():
class DerivedA : public virtual Base
{
public:
virtual void A() {
printf("Hello from A");
}
};
class DerivedB : public virtual Base
{
public:
virtual void B() {
printf("Hello from B");
}
};
声明中的 virtual 关键字应该可以解决菱形问题。
现在我想将这两个类组合成另一个类,这样 A() 和 B() 都实现了,如下所示:
class DerivedC: public DerivedA, public DerivedB {
// Now DerivedA and DerivedB are combined
};
// Somewhere else in the code
DerivedC c;
c.A();
c.B();
问题:
即使 G++ 可以很好地编译代码,Eclipse 也会给出错误:The type 'DerivedC' must implement the inherited pure virtual method 'Base::B'
. 使用 Visual Studio 编译时,我收到 2 个警告:
warning C4250: 'DerivedC' : inherits 'DerivedB::DerivedB::B' via dominance
warning C4250: 'DerivedC' : inherits 'DerivedA::DerivedA::A' via dominance
所以问题是:这样做的正确方法是什么?上面的代码会产生未定义的行为吗?
注意:标题可能有点误导,我不知道这个问题的好标题是什么。