正文

虚函数原理的一个小例子2008-11-20 18:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/aurora/39500.html

分享到:

class A {     virtual void fun(){printf("this is a's private fun\n");} }; class B { public:     virtual void fun(){printf("this is b's public fun\n");} }; int _tmain(int argc, _TCHAR* argv[]) {     A* pa = new A;     B* pb=(B*)pa;     pb->fun();     return 0; } 对于pb->fun()编译器首先检查pb的类型为B,于是到B的定义里找fun发现是virtual。于是做了如下转换: typedef void (*pFoo)(); pFoo(*(int*)(*((int*)pb)))(); 这样起始调用的是A中的fun。 如果B的fun为虚,而A的fun非虚,编译器同样会做上面的转换,当然运行的时候就报内存访问违规了。原因很简单,A中并没有虚函数,自然不会有虚表。 如果B的fun是非virtual,编译器就编译器就直接调用了B中的fun: B::fun(); 这种调用最简单,因为不涉及虚函数,自然不会做类似上面的转换。

阅读(3231) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册