假设我有一些类:Base
,Derived1
,Derived2
,...等等。所有派生类均源自Base
。现在,我想为所有派生类添加一些功能,但是无法修改这些类。所以我想出了以下方法:
Additional
使用虚拟继承创建一个类,如下所示:
class Additional: virtual public Base {
void f() {
//some codes operating on class Base
}
};
然后,我可以通过这种方式扩展每个派生类:
class MyDerived1: public Derived1, public Additional {};
但是,当我搜索Internet时,似乎在菱形继承的情况下,我们必须对类Derived1
和都使用虚拟继承Additional
。结果,上述方法将行不通。所以我的问题是:
非常感谢你!
为什么必须为钻石继承案例使用两个虚拟继承?
虚拟继承是类必须自愿签订的合同。该类基本上是在说它愿意与另一个派生类的实例共享其基本子对象。它会影响对象布局以及在类代码中对基址的访问。您不能追溯更改这些内容,尤其是在编译类实现并且仅将其作为目标文件提供给您的情况下。
如果我的方法不起作用,是否有另一种方法可以解决上述困难?
是的,请使用模板。
template<class BaseT>
class Additional: public BaseT {
void f() {
//some codes operating on class Base
}
};
using MyDerived1 = Additional<Derived1>;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句