C++笔记14•虚继承Vs虚函数•

虚继承

1.虚继承

cpp 复制代码
class A
{
public:
	int _a;
};
class B: public A
{
public:
	int _b;
};
class C : public A
{
public:
	int _c;
};
class D : public B, public C
{
public:
	int _d;
};

int main()
{
	D d;
	//d._a = 1;编译不能通过 菱形继承的二义性
	d.B::_a = 2;
	d.C::_a = 3;//但是这个也存在数据冗余 A B C D 都有_a
	//所以菱形继承问题存在数据冗余和二义性问题----->解决方案虚继承
	d._b = 4;
	d._c = 5;
	d._d = 6;

	return 0;
}
点击并拖拽以移动

虽然可以制定类去访问成员,解决二义性,但是每个类都有_a;造成数据的冗余,也没有解决。所以就引入了虚继承的解决方案

虚继承解决菱形继承的缺陷(二义性和数据冗余) ,需要引入关键词virtual ;看下方代码:

cpp 复制代码
class A
{
public:
	int _a;
};
class B : virtual public A
{
public:
	int _b;
};
class C : virtual public A
{
public:
	int _c;
};
class D : public B, public C
{
public:
	int _d;
};
int main()
{
	D d;
	//d._a = 1;编译不能通过 菱形继承的二义性
	d.B::_a = 2;
	d.C::_a = 3;


	d._b = 4;
	d._c = 5;
	d._d = 6;
	d._a = 7;


	return 0;
}
点击并拖拽以移动

上方的图就是介绍里了虚继承的原理:其中D、B、C、都继承了A,A被称为虚基类。故D的对象d中将有虚基表,虚基表中存放的偏移量为了使B、C能够获取到_a。

原理就是:将虚基类的对象(A)放到公共位置(一般VS是放到整个对象(D)的尾部)虚基表中存放的偏移量,来计算虚基类对象的位置。

2.虚函数

(1)概念:

虚函数的设置就是为了多态而来的,是构成多态的条件之一。也是需要引入关键词virtual,虽然和虚继承都要引入这个关键词,但是它们之间没有任何关联,注意区分。

(2)多态的原理:为什么要说这个呢,因为它的原理牵扯到一个词虚函数表,简称**"虚表",**注意这个不是虚基表哦,一个字之差就千差万别。

也就是说虚函数地址放到对象的虚表中,多态指向哪个对象时,就去调用这个对象对应的虚函数,本质就是运行时 到对象的虚表中(虚表是一个函数指针数组,通过地址)找到对应的虚函数。详细看C++笔记13•面向对象之多态•-CSDN博客

3.总结

(1)虚继承和虚函数都存在关键字:virtual;但是代表意义作用不一样,毫无关联。

(2)虚继承解决菱形继承的缺陷(二义性和数据冗余),虚函数是多态的条件之一

(3)虚基表和虚表都是存在代码段(C语言叫做常量区)。

通过代码验证:虚基表和字符串的地址很接近,字符串是存放在代码段的,也就是说虚基表也存放在代码段。

cpp 复制代码
	printf("虚基表:%p\n", *(int*)&d);
	static int n = 1;
	printf("静态变量(数据段):%p\n", &n);
	const char* ptr = "xcn";
	printf("代码段(常量区):%p\n", ptr);
相关推荐
羑悻的小杀马特5 分钟前
【AIGC篇】畅谈游戏开发设计中AIGC所发挥的不可或缺的作用
c++·人工智能·aigc·游戏开发
m0_689618289 分钟前
数学建模助力干细胞研究,配体纳米簇如何影响干细胞命运
笔记·数学建模
闻缺陷则喜何志丹13 分钟前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
羊村懒哥1 小时前
tomcat-安装笔记(包含虚拟主机配置)
java·笔记·tomcat
初学者丶一起加油1 小时前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
CodeClimb2 小时前
【华为OD-E卷-租车骑绿道 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
qq_430583972 小时前
QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
开发语言·笔记·qt
易码智能2 小时前
【RealTimeCallBack】- KRTS C++示例精讲(4)
c++·定时器·kithara·windows 实时套件·krts
小王爱吃月亮糖2 小时前
QT-QVariant类应用
开发语言·c++·笔记·qt·visual studio
计科土狗2 小时前
基于c语言的union、字符串、格式化输入输出
c++