正文

虚函数原理的一个小例子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(); 这种调用最简单,因为不涉及虚函数,自然不会做类似上面的转换。

阅读(3129) | 评论(0)


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

评论

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