我们可以在钻石继承模式中仅使用一种虚拟继承吗?

zbh2047

假设我有一些类:BaseDerived1Derived2,...等等。所有派生类均源自Base现在,我想为所有派生类添加一些功能,但是无法修改这些类。所以我想出了以下方法:

Additional使用虚拟继承创建一个类,如下所示:

class Additional: virtual public Base {
    void f() {
        //some codes operating on class Base
    }
};

然后,我可以通过这种方式扩展每个派生类:

class MyDerived1: public Derived1, public Additional {};

但是,当我搜索Internet时,似乎在菱形继承的情况下,我们必须对类Derived1都使用虚拟继承Additional结果,上述方法将行不通。所以我的问题是:

  • 为什么必须为钻石继承案例使用两个虚拟继承?
  • 如果我的方法不起作用,是否有另一种方法可以解决上述困难?

非常感谢你!

讲故事的人-Unslander Monica

为什么必须为钻石继承案例使用两个虚拟继承?

虚拟继承是类必须自愿签订的合同。该类基本上是在说它愿意与另一个派生类的实例共享其基本子对象。它会影响对象布局以及在类代码中对基址的访问。您不能追溯更改这些内容,尤其是在编译类实现并且仅将其作为目标文件提供给您的情况下。

如果我的方法不起作用,是否有另一种方法可以解决上述困难?

是的,请使用模板。

template<class BaseT>
class Additional: public BaseT {
    void f() {
        //some codes operating on class Base
    }
};

using MyDerived1 = Additional<Derived1>;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以在JavaScript中仅调用基本构造函数而不使用原型来模拟继承吗?

来自分类Dev

继承是Go中嵌入式结构的一种特殊情况吗?

来自分类Dev

控制器继承在AngularJS中是一种好习惯吗?

来自分类Dev

仅将表用于多重继承是一种不好的做法吗?

来自分类Dev

仅具有1个虚拟继承的钻石问题

来自分类Dev

我们可以使用继承实现链接列表吗?

来自分类Dev

我们可以在Java的多级继承中从第二个子类调用超类构造函数吗

来自分类Dev

从接口继承的方法可以返回接口中的另一种类型吗?

来自分类Dev

那么我们可以将虚拟函数与分配在堆栈上的对象一起使用吗?

来自分类Dev

我们可以继承Java中的基类构造函数吗

来自分类Dev

如何从另一种方法(不是我们正在覆盖的方法)继承phpdoc

来自分类Dev

std :: char_traits中使用的静态方法是一种继承吗?

来自分类Dev

我们可以在黄瓜的另一种情况下调用一种情况吗?

来自分类Dev

我们可以在复选框的[checked]属性上使用一种方法将其设置为true / false吗?

来自分类Dev

我们可以继承另一个类中的一个类中定义的自定义变量吗?

来自分类Dev

我们可以在caa的Buildgraph方法中仅使用initialstate和null状态吗?

来自分类Dev

我们可以使用从WinForms控件继承的对象作为.NET Hashtable的键吗?

来自分类Dev

C ++虚拟钻石继承

来自分类Dev

我们可以在C中实现继承吗

来自分类Dev

我们可以使用继承来实现链接列表吗?

来自分类Dev

我可以使用继承而不是在策略模式中实现接口吗?

来自分类Dev

从接口继承的方法可以返回接口中的另一种类型吗?

来自分类Dev

我们可以说方法本地类是内部类的一种吗?

来自分类Dev

我们可以将ubuntu 14.04更新到ubuntu 16.04,这是另一种ubuntu风格吗?

来自分类Dev

在SSIS中,我们可以从几种方法中调用或执行一种方法的方法

来自分类Dev

我们可以使用虚拟机建立一个对世界开放的服务器吗?

来自分类Dev

我们可以仅使用一辆车来优化 VRPTW 中的行驶距离吗?

来自分类Dev

在处理 RecyclerView 列表项时使用继承是一种反模式吗?

来自分类Dev

像,虚拟函数我们可以在 C++ 中创建一个虚拟变量

Related 相关文章

  1. 1

    我可以在JavaScript中仅调用基本构造函数而不使用原型来模拟继承吗?

  2. 2

    继承是Go中嵌入式结构的一种特殊情况吗?

  3. 3

    控制器继承在AngularJS中是一种好习惯吗?

  4. 4

    仅将表用于多重继承是一种不好的做法吗?

  5. 5

    仅具有1个虚拟继承的钻石问题

  6. 6

    我们可以使用继承实现链接列表吗?

  7. 7

    我们可以在Java的多级继承中从第二个子类调用超类构造函数吗

  8. 8

    从接口继承的方法可以返回接口中的另一种类型吗?

  9. 9

    那么我们可以将虚拟函数与分配在堆栈上的对象一起使用吗?

  10. 10

    我们可以继承Java中的基类构造函数吗

  11. 11

    如何从另一种方法(不是我们正在覆盖的方法)继承phpdoc

  12. 12

    std :: char_traits中使用的静态方法是一种继承吗?

  13. 13

    我们可以在黄瓜的另一种情况下调用一种情况吗?

  14. 14

    我们可以在复选框的[checked]属性上使用一种方法将其设置为true / false吗?

  15. 15

    我们可以继承另一个类中的一个类中定义的自定义变量吗?

  16. 16

    我们可以在caa的Buildgraph方法中仅使用initialstate和null状态吗?

  17. 17

    我们可以使用从WinForms控件继承的对象作为.NET Hashtable的键吗?

  18. 18

    C ++虚拟钻石继承

  19. 19

    我们可以在C中实现继承吗

  20. 20

    我们可以使用继承来实现链接列表吗?

  21. 21

    我可以使用继承而不是在策略模式中实现接口吗?

  22. 22

    从接口继承的方法可以返回接口中的另一种类型吗?

  23. 23

    我们可以说方法本地类是内部类的一种吗?

  24. 24

    我们可以将ubuntu 14.04更新到ubuntu 16.04,这是另一种ubuntu风格吗?

  25. 25

    在SSIS中,我们可以从几种方法中调用或执行一种方法的方法

  26. 26

    我们可以使用虚拟机建立一个对世界开放的服务器吗?

  27. 27

    我们可以仅使用一辆车来优化 VRPTW 中的行驶距离吗?

  28. 28

    在处理 RecyclerView 列表项时使用继承是一种反模式吗?

  29. 29

    像,虚拟函数我们可以在 C++ 中创建一个虚拟变量

热门标签

归档