C++学习菱形继承与虚继承

#include<iostream>
using namespace std;

//菱形继承
struct Person{
	int m_age;
};
struct Student :Person{
	int m_score;
};
struct Worker : Person{
	int m_salary;
};
struct Undergradute :Student, Worker{
	int m_grade;
};


int main() {

	Undergradute ug;
	cout << sizeof(ug) << endl;//20
    //ug.m_age=10;//由于二义性,ug不能正常访问m_age

	getchar();
	return 0;
}

菱形继承带来的问题:
1.造成成员变量冗余(空间占用较多)
2.成员变量具有二义性

ug对象内存分布(占用20 个字节):
在这里插入图片描述
通过虚继承解决上述问题(虚继承让Student和Worker共同一个m_age):

#include<iostream>
using namespace std;

//菱形继承→虚继承
struct Person{
	int m_age;
};
struct Student :virtual Person{
	int m_score;
};
struct Worker : virtual Person{
	int m_salary;
};
struct Undergradute :Student, Worker{
	int m_grade;
};


int main() {

	Undergradute ug;
	cout << sizeof(ug) << endl;//24

	ug.m_age = 10;//此时可以正常访问,二义性问题解决

	getchar();
	return 0;
}

在上述虚继承中,Person类称为虚基类
使用虚继承后的内存分布(占用24字节,占用空间多于上面菱形继承的20字节。这是由于虚基类成员变量只有一个,所以这里体现不出虚继承的优势,当成员变量有很多时,内存占用会比菱形继承少):
在这里插入图片描述
红色:虚表指针与本类起始的偏移量(一般为0)
绿色:虚基类第一个成员变量与本类起始的偏移量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值