C++ 浅谈virtual

virtual有两种用途

1,虚函数

2,虚继承

 

 

虚函数

虚函数出来的主要目的是实现多态,虚函数的组成有 “虚函数指针”  “虚函数表”

编译器在编译的过程中,如果检测到类里面有virtual修饰的函数,那么就会生成一个虚函数表,然后实例化对象的时候生成一个虚函数指针,对象可以通过虚函数指针来对虚函数表进行操作,虚函数指针位于对象的首地址,然后虚函数指针指向的又是虚函数表的首地址,虚函数表包含了所有的虚函数

多态:首先要知道的是,子类继承父类,是将父类对应的内存+自己的,然后上行转换的时候,就是将子类对应父类的内存给父类,多态->基类定义虚函数,子类进行重写,重写过后,子类对应的的虚函数表进行了重写成为了新的,然后上行转换,父类得到子类中继承自父类的虚函数表,因为虚函数表的对应函数已经被修改,给过去之后,父类实质上调用的是子类的函数

对象如果有虚函数指针的话要占内存4字节

 

 

虚继承

虚继承出现的目的是为了解决菱形继承,菱形继承也就是基类A    子类B,C分别继承A     D多继承B,C,然后就会产生两个问题,基类A中的成员进行了两次拷贝,浪费内存。还有就是调用基类A中的成员时,要引用类名::成员,说明调用的时来自哪个类的,不然会编译错误,编译器无法识别成员是来自B,C哪个类,这样就出现了二义性

虚继承的话也就是在 B,C继承的时候前面加上virtual关键字,那么对象就会有一个虚基类指针,对应类也有一个虚基类表,虚基类表中存储的是当前类与父类的偏移量,利用偏移量来调用父类的成员,这样多个派生类虚继承于基类,但是实际上都是利用偏移量来调用的,然后D就会继承来自BC的虚基类指针,并且利用虚基类指针来调用A类成员,实现了一份内存的调用不需要两份拷贝

 

原文链接: https://www.cnblogs.com/Lis-/p/12504516.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 浅谈virtual

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/335691

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午10:16
下一篇 2023年3月1日 下午10:16

相关推荐