当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?
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 继承自 B、C 和 D 类被实例化,然后只会创建 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 B、C和D,但class D 不会虚拟继承 A 类。在这种情况下,A 类的 2 个对象被实例化,对吗? - B、C 一个,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 个类 - B、C、D,我们假设我们有 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.
【讨论】:
以上是关于当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章