【问题标题】:Virtual Inheritance, one class enough?虚拟继承,一个类就够了?
【发布时间】:2012-12-06 21:01:29
【问题描述】:

我了解虚拟继承的概念,但在任何地方都找不到答案。假设你有继承类 B 和 C 的类 D。B 和 C 都继承类 A。所以你可以让 B 和 C 虚拟继承 A 以避免 A 的两个实例。但是你必须在 B 和 C 上都指定虚拟继承或者如果两者中的一个实际上继承了 A 而另一个没有,它是否已经只创建了一个 A 的实例?

谢谢

【问题讨论】:

    标签: c++ multiple-inheritance virtual-inheritance


    【解决方案1】:

    他们必须都是virtual。从 C++11 10.1 [class.mi]/7:

    一个类可以同时具有给定类型的虚拟和非虚拟基类。

    class B { /* ... */ };
    class X : virtual public B { /* ... */ };
    class Y : virtual public B { /* ... */ };
    class Z : public B { /* ... */ };
    class AA : public X, public Y, public Z { /* ... */ };
    

    对于AA 类的对象,AA 的类格中基类B 的所有虚拟出现对应于AA 类型对象内的单个B 子对象,并且每隔一个出现AA 的类格中的(非虚拟)基类 BAA 类型对象内的不同 B 子对象一一对应。给定上面定义的类AA,类AA有类B的两个子对象:ZBXY共享的虚拟B,如下图所示。

    【讨论】:

    • 另外,§10.1/4 实际上定义了这一点。
    • @sftrabbit:在哪个标准副本中?在 C++03 中为10.1 [class.mi]/6;在最新的可用工作文件 N3485 中,它仍然是 10.1 [class.mi]/7。我没有在10.1 [class.mi]/4 中定义的任何标准副本。
    • 我一直想知道为什么他们不允许 OP 的要求。我没有看到虚拟孩子指向非虚拟孩子的父母的任何逻辑障碍。
    • @BillyONEal 道歉。我的意思是 10.1/4(在 C++11 中)定义了派生类中出现了多少基类副本,而您的段落是它发生的一个例子。 :)
    • @enobayram:因为上面示例中的类Z 可能具有假设它有自己的类B 的副本的不变量。如果一个类是为虚拟继承而设计的,那么它的代码必须反映其他类可能会更改其任何虚拟继承成员的底层副本。
    【解决方案2】:

    您需要为 B 和 C 指定一个虚拟继承,才能拥有一个 A。否则,未使用虚拟继承的类将“共享”类 A。

    这可以使一个人拥有以下:

    为什么要这样做是另一回事。

    【讨论】:

    • 遗憾的是我只能接受一个答案,不过感谢您的解释;)
    • 手绘和扫描图我要 +1。
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-08-24
    相关资源
    最近更新 更多