C++虚函数表汇总
来源:互联网 发布:淘宝客服基础知识 编辑:程序博客网 时间:2024/05/20 02:29
1. 虚函数与虚函数表基本知识
这里有一篇介绍,只需看前两页,各种配图,很形象:http://dev.yesky.com/208/8061708.shtml
这篇文章则更精练,只需看第一段就好:http://blog.csdn.net/jiangnanyouzi/article/details/3720807
总的来说,每一个拥有virtual function的类实例化对象时,都会额外申请一块内存存储虚函数表存储所有虚函数地址,并在对象某个位置存储一个vptr指针指向该表起始地址。这个指针具体放在什么位置,虚函数表怎么组织,怎么索引各个虚函数,这些都是编译器在编译期间决定的,在不同编译环境下不见得相同。
2. 多态子类的调用顺序 -- 为什么不要在构造函数中调用虚函数
原因是,在子类的构造函数执行时,虚函数表还没有被子类覆盖,换句话说,此时调用的函数是当前类的函数,虚函数机制在构造函数中无法触发。其原因在于子类构造时各个初始化步骤的调用顺序:
全部推演过程见此:http://saturnman.blog.163.com/blog/static/557611201081421344244/
直接摘录构造顺序:
1.构造子类构造函数的参数
2.子类调用基类构造函数
3.基类设置vptr
4.基类初始化列表内容进行构造
5.基类函数体调用
6.子类设置vptr
7.子类初始化列表内容进行构造
8.子类构造函数体调用
(注意一点,初始化列表内的数据不按书写顺序,而是按类内部的定义顺序)
析构的顺序恰好相反,所以也不要在析构函数中调用虚函数,那样也是没有意义的。
3. 如何去验证虚函数表的存在
其实在第一个链接里已经有了示例程序。
如果你看不懂函数指针,请看这里:http://hi.baidu.com/homonia/blog/item/90b7a72c49c521ea8a1399e2.html
4. 为什么构造函数不能是虚函数
从设计理念上说,构造函数不需要是虚函数;从当前vptr的实现机制上说,无法实现虚的构造函数。
详细可见这里:http://www.diybl.com/course/3_program/c++/cppxl/2008320/105849.html
原文地址:http://hi.baidu.com/hehehehello/item/60b7390d29003bc32e4c6b8d
- C字符串函数汇总
- [C#]常用函数汇总
- C++primer函数汇总
- C++虚函数表汇总
- C语言字符串函数汇总
- C语言字符串函数汇总
- C语言字符串函数汇总
- C语言时间函数汇总
- C/C++计时函数汇总
- c语言内存操作函数汇总
- C++string类常用函数大汇总
- C语言内存操作函数汇总
- c语言string类函数实现汇总
- C语言的get函数汇总
- C语言的put函数汇总
- C++——数学函数汇总
- c语言内存操作函数汇总
- C语言之常用函数汇总
- 为程序员准备的7个网站
- 常用颜色及RGB配色表
- Unix的缺陷
- HDU 4267 - A Simple Problem with Integers
- 雅虎面试题─将两个双向循环链表中data值相同的结点删除
- C++虚函数表汇总
- 八月小结
- 长春赛区2012 Alice and Bob 1002题 (网络赛)
- poj 3084 Panic Room
- eclipse找不到插件的解决方法
- HDU 4268 - Alice and Bob
- paip.提升用户体验与提升安全性----记住密码
- 链表经典问题:约瑟夫环的实现
- Android下的binder机制和IPC原理