虚继承

本文探讨了C++中虚继承的概念及其如何解决多重继承带来的二义性问题。通过具体的类继承实例,详细解释了虚继承下类的内存布局变化及虚基类指针的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚继承是为了消除多重继承带来的二义性。

以菱形继承为例:

class A
{
 public:
    int ma;
}
class B:public A
{
 public:
    B():A(){};
    int mb;
}
class C:public A
{
 public:
    C():A(){}
    int mc;
}
class D:public B,public C
{
 public:
    D():B(),C(){}
    int md;
}

 如下图:B和C的父类是A,D的父类是B和C

 

D的内存布局如下图所示:

可以看出D的内存布局中有两份A的数据,那当编译器给ma赋值时,是给B作用域下的ma还是C作用域下的ma,

这样就会产生二义性。

要消除二义性,就需要用到虚继承。把B类和C类继承A类继承都改为虚继承。

这时候A就成了B和C的虚基类。

这时候D的内存布局发生变化,把A::ma移到最底部,B::和C::多了一个虚基类指针(vbptr),它指向一个vbtable,这个表中存放的是从当前位置到虚基类成员变量(这指的是ma)的偏移量。通过偏移量可以找的虚基类成员变量的位置。

用了虚继承,我们必须在代码中给间接基类(这里指的A类)提供构造函数。代码就变成了如下结构:

class A
{
 public:
    int ma;
}
class B:virtual public A
{
 public:
    B():A(){};
    int mb;
}
class C:virtual public A
{
 public:
    C():A(){}
    int mc;
}
class D:public B,public C
{
 public:
    D():B(),C(),A(){}
    int md;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值