虚函数原理
来源:互联网 发布:口袋助理源码 编辑:程序博客网 时间:2024/06/07 06:44
http://www.cnblogs.com/rocketfan/archive/2009/09/18/1569294.html
虚函数表算是面试官最爱问的C++问题了,如果你的简历提到熟悉C++而关于虚函数机制没有回答好,那么你就会被怀疑。。。:)
我觉得虽然理解虚函数表不是编程必须的,但是了解一下还是有帮助的,侯捷翻译的<<Inside C++ model>>应该是最详细解释所有这些的了。不过网上有很多很好的资源,
下面转载陈皓的文章http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx
主要为了查阅方便,另外转载http://www.pconline.com.cn/pcedu/empolder/gj/c/0503/566020.html管宁写的关于函数指针写的很清楚。
另外关于C++虚函数解析需要补充的是作者为了实现清晰,没有提到c++的this指针, 对于 Base.f()其实它的原型是类似f(Base* this)的函数,由于作者用了
强制类型转换所以用了typedef void(*Fun)(void); 如果f()函数中会访问到Base的数据成员,那么结果显然是不对的。可以用typedef void(*Fun2)(int *);
或者typedef void(*Fun3)(Base *);
class Base {
public:
Base():x(3), y(4){}
virtual void f() { cout << "Base::f" << endl; cout << "my x is " << x << endl;}
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
int x;
int y;
};
Base b;
Fun2 pfun2;
pfun2 = (Fun2)*((int *)*(int *)(&b));
pfun2((int *)&b);
Fun3 pfun3;
pfun3 = (Fun3)*((int *)*(int *)(&b));
pfun3(&b);
这样产生的结果才会和Base base; base.f()完全相同,显示3,而利用typedef void(*Fun)(void),结果是 -1209178304
(当然因为作者给的例子中f()函数中没有访问对象数据成员,结果也就不会出错,作者仅仅是为了演示虚函数表的实现。)
另外实验了下,虚函数表的指针会占用对象的第一个位置,之后是对象数据,上面的例子中x,然后是y。
虚函数表每个类拥有一个,相同的类不同实例对象的虚函数表指针都指向相同的一个虚函数表。
0 0
- 虚函数的原理
- 虚函数工作原理
- 虚函数的原理
- 虚函数实现原理
- 虚函数实现原理
- 虚函数原理1
- 虚函数工作原理
- 虚函数实现原理
- 虚函数实现原理
- 虚函数实现原理
- 虚函数原理2
- 虚函数实现原理
- C++虚函数原理
- c++虚函数 原理
- 虚函数实现原理
- 虚函数 原理
- 虚函数原理
- 虚函数 原理
- C++中struct与class的区别
- Android Studio系列教程二--基本设置与运行
- 如何在Qsys工具中配置HPS以及介绍DE1_SOC的GHRD工程
- Java中Runnable和Thread的区别 编辑
- android 电容屏(二):驱动调试之基本概念篇
- 虚函数原理
- 从零开始学习jQuery (一) 开天辟地入门篇
- 深入浅出类的赋值、拷贝
- 【BZOJ 1023】 [SHOI2008]cactus仙人掌图
- android 电容屏(三):驱动调试之驱动程序分析篇
- 【转载】记录一下在使用Servlet中getRequestDispatcher()和sendRedirect()的区别
- 深入了解字符集和编码
- 从零开始学习jQuery (二) 万能的选择器
- makefile文件的编写规则及实例 (转)