我目前正在尝试围绕 C++ 继承的基础知识进行梳理。考虑以下代码:
// Interfaces
class InterfaceBase
{
public:
virtual void SomeMethod() = 0;
};
class InterfaceInherited : public InterfaceBase
{
};
// Classes
class ClassBase : public InterfaceBase
{
public:
virtual void SomeMethod()
{
}
};
class ClassInherited : public ClassBase, public InterfaceInherited
{
};
int main()
{
ClassBase myBase; // OK
ClassInherited myInherited; // Error on this line
return 0;
}
这里我有两个具有继承关系的接口。实现接口的两个类也是如此。
这给了我以下编译器错误:
C2259 'ClassInherited': cannot instantiate abstract class
似乎ClassInherited 类没有从ClassBase 继承SomeMethod 的实现。因此它是抽象的,不能被实例化。
我需要如何修改这个简单的例子才能让 ClassInherited 从 ClassBase 继承所有实现的方法?
答案 0 :(得分:4)
您遇到了 diamond problem。 解决方案是使用virtual inheritance(Live),确保只有一个基类成员被孙子继承:
// Interfaces
class InterfaceBase
{
public:
virtual void SomeMethod() = 0;
};
class InterfaceInherited : virtual public InterfaceBase
{
};
// Classes
class ClassBase : virtual public InterfaceBase
{
public:
virtual void SomeMethod()
{
}
};
class ClassInherited : public ClassBase, public InterfaceInherited
{
};
int main()
{
ClassBase myBase; // OK
ClassInherited myInherited; // OK
return 0;
}