虚函数指针和虚函数表

1、若基类析构函数不是虚的,仅会调用基类析构,导致派生类资源未释放。

基类函数非虚函数,静态编译,编译器在编译期间判断指针类型为基类,只调基类析构函数;
基类函数为虚函数,编译器编译时,判断指针类型为基类,调用函数为虚函数,动态绑定,会通过虚函数表去寻找析构函数,调用的是子类的析构函数,子类析构时,会在最后自动调用基类的析构函数;

2、类的构造和析构函数

子类构造函数编译器会自动插入代码首先调基类构造函数
子类析构函数,编译器会插入代码,最后结尾调用基类析构函数

3、如果编译器能够在编译期确定具体类型,此时并不经过 vtable,可以直接静态绑定,只有在类型未知或通过基类指针/引用调用时,才使用 vtable 实现动态绑定。

1、通过指针/引用,必通过vtable ;
2、直接对象,基类/子类对象调用,静态绑定;
3、模板能推导类型,静态绑定;

4、虚函数表的继承规则

基本规则:虚函数表继承所有虚函数,与访问权限无关
所有虚函数都在虚函数表中,访问权限不影响虚函数表的构成。
访问权限控制的是调用权限,不是继承权限
派生类虚函数表自动包含基类所有虚函数
重写时可以改变访问权限(但通常不推荐)

5、访问权限的继承规则

访问权限在编译期检查,不能等到运行时才知道;
因此即使父类指针指向子类对象,权限也要检查父类虚函数的权限,如果父类权限不能调用,那么直接不能调用;
那么子类虚函数的调用权限什么时候检查,运行期吗?x
标准要求:如果派生类重写的版本访问权限更严格,整个调用应该在编译期被拒绝。

因此权限检查是:先检查父类虚函数权限,再检查子类重写后的权限是否比父类小;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值