C/C++ 虚函数

本文详细介绍了C++中虚函数的作用和动态绑定的概念,阐述了虚函数如何通过基类指针调用子类方法,以及在单继承和多继承情况下虚函数表的组织方式。动态绑定依赖于虚函数表(Vtable)和隐藏的虚函数指针(VPTR),确保在运行时能正确调用相应函数。理解这一机制对于深入掌握C++的多态性至关重要。
摘要由CSDN通过智能技术生成

多态,不同数据类型(父子类)用同一个接口

虚函数的优势在于当用指针调用虚函数的时候,即使是基类类型的指针,也会调用到派生类型的函数。
示例

父类使用虚函数后,子类继承时实现动态绑定

有了虚函数我们就能通过基类的的指针进行动态绑定,在运行时访问到子类的函数,但是动态绑定只能发生在指针或引用上。

动态绑定

当编译器在编译过程中遇到virtual关键字时,它不会对函数调用进行绑定,而是为包含虚函数的类建立一张虚函数表Vtable。在虚函数表中,编译器按照虚函数的声明顺序依次保存虚函数地址。同时,编译器会在类中添加一个隐藏的虚函数指针VPTR,指向虚函数表。在创建对象时,将虚函数指针VPTR放置在对象的起始位置,为其分配空间,并调用构造函数将其初始化为虚函数表地址。需要注意的是,虚函数表不占用对象空间。

1、单继承下的虚函数表

虚函数表中的指针顺序,按照虚函数声明的顺序排序;基类的虚函数指针在派生类的前面。

2、多继承下的虚函数表

多继承关系下会有多个虚函数表,也会有多个指向不同虚函数表的指针;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值