当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?

Posted

技术标签:

【中文标题】当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?【英文标题】:Is this the right approach to count the number of base class objects created when there is a partial virtual inheritance involved? 【发布时间】:2021-01-24 06:08:59 【问题描述】:

根据我对虚拟继承的了解,每当我们有一个 class A(基类)、classes B、C、D(所有这三个虚拟继承class A) 那么如果有一个 class derived 继承自 BCD 类被实例化,然后只会创建 class A 的单个对象。

我试图通过不同的案例来推理虚拟继承:

案例 1:

假设 派生 类仅继承自 B 类C。即使这样,也只有一个 class A 的对象被实例化,对吧?

我尝试使用此代码验证这一点,并且确实是这样:

#include <iostream>
using namespace std;
class A

    public:
    int a;
;
class B: virtual public A

  public:
  int b;
;
class C: virtual public A

    public:
    int c;
;
class D: virtual public A

    public:
    int d;
;
class derived: public B, public C

    public:
    int y;
;
int main() 

    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    return 0;

输出:

0x7ffc8adac1c0
0x7ffc8adac1c0

案例 2:

假设派生类继承自class BCD,但class D 不会虚拟继承 A 类。在这种情况下,A 类的 2 个对象被实例化,对吗? - BC 一个,D 一个。

我尝试使用此代码验证这一点,并且确实是这样:

#include <iostream>
using namespace std;
class A

    public:
    int a;
;
class B: virtual public A

  public:
  int b;
;
class C: virtual public A

    public:
    int c;
;
class D: public A

    public:
    int d;
;
class derived: public B, public C, public D

    public:
    int y;
;
int main() 

    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    cout<<&(dObj.D::a)<<'\n';
    return 0;

输出:

0x7ffd512429c8
0x7ffd512429c8
0x7ffd512429bc

现在这是我的问题:

我的观察正确吗?也就是说,不是只有 3 个类 - BCD,我们假设我们有 n 个类继承 class A,如果其中有 m (1derived 的类继承,并且如果在那些 m 个类中只有 k (0A,那么类的对象数在实例化 派生 类时被实例化的 A 将是 = 1+m-k(如果 k!=0)和 m(当 k=0 时),对吗?

【问题讨论】:

【参考方案1】:

cppreference网站上写的内容来看确实是这样:

See the first example under the virtual base classes section.

【讨论】:

以上是关于当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 无法创建继承层次结构的基类(抽象)对象列表

如何在WPF中自定义控件

继承中的基类是不是复制到派生类?

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

继承和动态规划的危险

您可以拥有与您继承的基类相同的类的私有成员吗?