接口继承

时间:2021-01-04 08:42:11

标签: c++ inheritance interface

我目前正在尝试围绕 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 的实现。因此它是抽象的,不能被实例化。

我需要如何修改这个简单的例子才能让 ClassInheritedClassBase 继承所有实现的方法?

1 个答案:

答案 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;
}