通过从具体 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。我能让它工作的唯一方法是使用虚拟继承,但后来我收到编译器关于通过支配继承的警告。
有什么问题吗?
通过多重继承,Extended
从 BaseInterface
继承了两次。这意味着有两个独立的 BaseInterface
子对象:
一个是通过具体Base
class继承的,它覆盖了所有的纯虚函数
但另一个是通过ExtendedInterface
class继承的,这仍然是抽象的。
因此,由于 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
假设我有一个继承自另一个接口的接口(纯抽象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。我能让它工作的唯一方法是使用虚拟继承,但后来我收到编译器关于通过支配继承的警告。
有什么问题吗?
通过多重继承,Extended
从 BaseInterface
继承了两次。这意味着有两个独立的 BaseInterface
子对象:
一个是通过具体
Base
class继承的,它覆盖了所有的纯虚函数但另一个是通过
ExtendedInterface
class继承的,这仍然是抽象的。
因此,由于 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