虚函数表拾遗

1  一般情况下,不允许在构造函数或者析构函数中调用虚函数。其实语法上都没有问题,只是会失去多态性。
如果在构造函数中调用虚函数,会先调用父类中的实现,也就失去了多态的性质。如果在析构函数中调用虚函数,也是同样的失去了多态性。

执行结果如下:

这段代码可以看出构造和析构函数中都调用了自己的函数,虚函数表没有生效。

2 虚函数表属于类,不属于某一个对象,如下所示,ptr和ptr2的虚函数表指向同一个地址

classvirtualtabe这个函数中三个变量,ptr和ptr2的虚函数表地址一致。

3 构造函数调用完毕后开始构建虚函数表。      
先构造基类的虚函数表(基类的构造函数结束后)      
再构造派生类的虚函数表(派生类的构造函数结束后)        
析构的顺序与之相反,派生类析构函数运行完之后虚函数表指向基类的虚函数表,                基类的虚函数表运行完之后虚函数表彻底释放。
还是上一段代码,    

基类A的构造函数开始运行前(没有进入构造函数)

 
 基类A的构造函数开始运行后(进入构造函数),也就是进入函数前已经把改类的虚函数表构建完成

此时虚函数表的函数都指向基类的地址

派生类B的构造函数开始运行后,虚函数表指向了派生类虚函数地址

以下是析构流程:

派生类B的析构函数运行时

基类A的析构函数开始运行前

基类A的析构函数开始运行时,也就是说基类析构函数运行前派生类析构函数开始运行前,虚函数表发生改变

基类A析构函数运行后,虚函数表再次变化。

也就是说本类的析构函数运行完后虚函数表指向其父类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值