[C++/菱形继承]

https://www.cnblogs.com/nexiyi/archive/2013/06/16/3138568.html
这篇关于继承和组合博客值得一看

复杂的菱形继承及菱形虚拟继承

  • 单继承:一个子类只有一个直接父类时称这个继承关系为单继承
    在这里插入图片描述
  • 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
    在这里插入图片描述
    在这里插入图片描述
  • 菱形继承:菱形继承是多继承的一种特殊情况
    在这里插入图片描述
  • 数据冗余:孙子类有两份爷爷类数据
  • 二义性:孙子类访问爷爷类成员时,每个父类都有对应的爷爷成员,编译器找不到

1. 不采用多继承方式

2.菱形虚拟继承 :virtual 关键字

  • 当父类继承爷爷类时加上virtual

菱形虚拟继承底层:内存对象成员模型

	将爷爷类中对象放到对象组成的最下面,所有原本存储爷爷类成员的位置存放的是一个指针,指向一张表。
这些指针是虚基表指针,指向的表叫虚基表,虚记表中存着偏移量,通过偏移量可以找到该成员实际位置。
(当前指针 + 偏移量)[使得继承环节上每个类类型的指针都能访问到]
class Base{
	int var;
};
class Base1 : virtual public Base
{
	int a1;
};
class Base2 : virtual public Base
{
	int a2;
};
class Derivepublic Base1 ,public Base2
{
	int Drv;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值