通过从具体 class 派生来填充抽象 class 成员

Filling out abstract class members by deriving from concrete class

假设我有一个继承自另一个接口的接口(纯抽象class)

class BaseInterface
{};

然后另一个接口基于 BaseInterface

class ExtendedInterface : public BaseInterface
{};

现在,我有一个实现 BaseInterface 的具体 class:

class Base : public BaseInterface
{};

现在,我想实现 ExtendedInterface,但是因为我已经有了 Base,所以我想用 base 填充 BaseInterface 成员。例如:

class Extended : public ExtendedInterface, public Base
{};

这似乎不起作用。我收到投诉说我无法实例化扩展,因为它是一个抽象 class。我能让它工作的唯一方法是使用虚拟继承,但后来我收到编译器关于通过支配继承的警告。

有什么问题吗?

通过多重继承,ExtendedBaseInterface 继承了两次。这意味着有两个独立的 BaseInterface 子对象:

  • 一个是通过具体Baseclass继承的,它覆盖了所有的纯虚函数

  • 但另一个是通过ExtendedInterfaceclass继承的,这仍然是抽象的。

因此,由于 Extended 的某些子对象仍然具有纯虚函数,因此您的 class 仍然是无法实例化的抽象 class。

如何解决?

尽管有多重继承,但您显然希望只有一个 BaseInterface,您需要使用虚拟继承:

class BaseInterface                                       
{ virtual void test()=0; };                              // abstract class

class ExtendedInterface : public virtual BaseInterface   // virtual inheritance
{};                                                      // abstract class

class Base : public virtual BaseInterface                // virtual inheritance
{ void test() override {} };                             // concrete class

class Extended : public ExtendedInterface, public Base   // multiple 
{};                             // thanks to virtual inheritance, concerete class 

按此逻辑,Extended中只有一个BaseInterface,重写了虚函数,可以实例化

这里是online demo