凌云窟
南山巅上火麟烈,北海潜深雪饮寒。可怜两锋未缘见,雪刀封隐孤剑鸣。
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

留言簿(0)

随笔分类

随笔档案

文章档案

相册

简历下载

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-22 文章-0 评论-38 Trackbacks-0

  好久不写blog都生疏了,刚好公司要组织一次C++的基本功考试,就一个派生类调用虚函数的问题研究了一下编译器的实现:

class A
{
public:
    A()
{}
    
~A(){}
     
virtual void Display(){cout<<"A"<<endl;}
}
;

class B:public A
{
public:
    B()
{Display();}
    
~B(){}
    
virtual void Display(){cout<<"B"<<endl;}
}
;
int main()
{
   B 
*pBb = new B;
   delete pBb;
}
在B(){Display();}设定一个断点,跟踪到汇编代码得到如下代码:
00401391   mov         eax,dword ptr [ebp-10h]
00401394   mov         dword ptr [eax],offset B::`vftable' (00432020)
0040139A   mov         ecx,dword ptr [ebp-10h]
0040139D   call        @ILT+155(B::Display) (004010a0)
前三排的代码是设置虚函数表,然后直接调用了B::Display函数,并没有通过虚函数表间接调用这个函数。这说明在构造函数中虽然虚函数表已经设置好了,但是调用虚函数是不会使用虚函数表的,是直接调用.

下面的代码是非构造函数内经过虚函数表间接调用Display的汇编码:
0040127E   mov         edx,dword ptr [ebp-10h]
00401281   mov         eax,dword ptr [edx]
00401283   mov         esi,esp
00401285   mov         ecx,dword ptr [ebp-10h]
00401288   call        dword ptr [eax]
posted on 2007-06-27 22:33 莫问春秋 阅读(4860) 评论(5)  编辑 收藏
Comments
  • # 没人灌,那我灌吧
    周星星
    Posted @ 2007-06-29 17:58
    虚函数表的作用是什么?
    因为对象的动态类型是什么,必须到运行时才知道,也就是只有到运行到那一步时,才知道应该实际调用哪个virtual函数。

    但在构造函数中,需要到运行时才能知道吗?它本身的类型就是其动态类型,所以根本不需要去查虚函数表。
  • # re: 构造函数调用虚函数追踪
    上海地图
    Posted @ 2007-07-02 12:17
    关注!
  • # re: 构造函数调用虚函数追踪
    莫问春秋
    Posted @ 2007-07-02 22:13
    赞同你的意见,当时这么想是因为看过一本书,那里说在构造函数就要设置好虚函数表,所以自然就想在构造函数中既然虚函数表已经设定好了,那有可能调用虚函数是通过虚函数表来调用哦。
    当然,事实证明这种说法是错的!原因正如你所说。
  • # re: 构造函数调用虚函数追踪
    maggie
    Posted @ 2007-09-03 15:49
    vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • # re: 构造函数调用虚函数追踪
    粉末涂料
    Posted @ 2008-05-27 11:58
    好东西,谢谢分享
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]