C++ virtual 使用和原理介绍 :推迟指针指向的决定

本文探讨了C++中virtual关键字的基本原理,解释了它如何实现多态,特别是通过动态绑定机制。虚拟函数允许在运行时决定函数调用,解决了类继承中的二义性和存储效率问题。虚析构函数在处理多态对象时至关重要,防止内存泄漏。此外,文章还介绍了虚表在实现虚函数中的角色,每个多态类都有一个虚表,包含虚函数的地址,对象通过虚表指针找到正确的函数实现。

这篇博客适合已经学过的同学再次思考和回忆,对不了解编译原理和基本编程语言基础的学者不友好

virtual根本原理

virtual 无论是函数,还是类继承中,他的真实功能就是推迟指针指向的决定,

将在编译期的决定推迟到运行时决定,于是就有了多态的实现,多态的原理便是运行时的动态绑定。

虚基类的继承是的类变量的指针可以推迟指向,而解决子类的二义性的问题以及存储浪费问题

编译期:虚函数的函数名符号指向是空的

运行期:虚函数的指针指向对象域,而不是类域

什么函数可以是虚函数

一般成员函数可以是
构造函数不能是虚函数
析构函数可以是虚函数
一般虚函数成员
声明:virtual return_type func_name(formal_parameter_list)
声明只能出现在类定义中的函数原型声明中
在派生类中可以对基类的成员函数覆盖(千万不要重写继承而来的非虚函数,因为达不到多态的效果)
虚函数一般不声明为内联函数,因为对虚函数的调用是动态的,而内联函数处理是编译期静态的
另外,1.派生类重写覆盖基类的虚函数时,也会被定义为虚函数,无论函数声明时是否加了virtual关键字

2.派生类中的虚函数重载还会隐藏基类的同名函数的其他重载显示(暂不清楚为什么)

故,一般派生类覆盖虚函数基函数时,一般怎加virtual关键字,提高程序可读性

虚析构函数

使用场景:允许他人使用基类的指针调用对象(基类对象或派生类对象)的析构函数,就需要使用虚析构函数——这也是应该做的,delete会正常运行;相反,如果不用虚析构函数,delete行为将是不可预测的,因为这个时候基类对象指针指向的对象函数表里存储的析构函数指针静态绑定到了基类的析构函数,在使用多态时,我们基类指针操作多态的派生类对象时,基类的析构函数不会释放派生类对象的相关的内存空间,会导致内存泄漏。

virtual关键字的实现,动态绑定实现窥览

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值