【问题标题】: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 时),对吗?

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

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

    See the first example under the virtual base classes section.

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 2015-07-16
      • 2013-01-26
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      相关资源
      最近更新 更多