关于虚函数表的心得

建议大家和这篇文章结合起来看

http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx

 

 

如果父类中存在虚函数,那么父类,以及由其直接和间接派生的子类都会存在虚函数表。每个类的虚函数表中存储的是这个类继承的虚函数以及自己实现的虚函数的地址。

比如说, Base 类 中定义了虚函数 virtual f(){};
而由Base类派生的Derived 类 重载了这个虚函数 virtual f(){};
那么,Base 类的虚函数表中存放的是 Base 类里定义的 f() 的地址
Derived 类的虚函数表中存放的是 Derived 类中定义的 f() 的地址


虚函数表中虚函数的顺序是这样的:
1、先列出父类的虚函数,再列出子类的虚函数
2、同一个类中的虚函数在虚函数表中的次序由声明次序决定
3、倘若子类重载了父类的虚函数(当然,若不重载的话,虚函数的存在也将失去意义),那么子类的虚函数表中,本该由父类的虚函数占据的位置由重载的子类虚函数替代

我觉得还有一点有必要写一下
我们都知道,我们永远不可能用父类的指针去调用子类的成员函数。
如果成员函数不是重载的虚函数,那么这点是很显然的
而如果这个成员函数是重载的虚函数呢?你能否给出一个完美的解释?
刚才我们总结了:每个类的虚函数表中存储的是每个类自己的虚函数的地址。
这就是说,父类的虚函数表中不存在子类重载的虚函数的地址!
因此,用父类的指针想去调用子类虚函数,,,还是洗洗睡吧。。。

最后有一点想说的是
不管是父类还是子类,虚函数表都存在他们的内存结构的头部(很早之前是在尾部的。。。)
但要注意的是,在内存结构的头部并不是真的存了一连串的虚函数地址
而实际上是保存了一个指针 vptr

就是这个vptr 指向了类的虚函数表 vtbl
可这个vtbl到底实际被存在什么地方

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值