首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

打印虚函数表:同一个函数为什么指针不一样解决办法

2012-02-08 
打印虚函数表::同一个函数为什么指针不一样昨天摩根斯坦利笔试受了点刺激,回来小小研究了一下虚函数表。今

打印虚函数表::同一个函数为什么指针不一样
昨天摩根斯坦利笔试受了点刺激,回来小小研究了一下虚函数表。今天写了一个输出虚函数表的程序。经过测试,在VC2005下运行正确。而且取出的虚函数指针的确能用。 最后还有一个问题没能解决:

  A a;

 MemFun p1 = &A::foo;
 MemFun p2 = ** ((MemFun**)&a );
 printf("p1 = %pt p2 = %pn", p1, p2);
 (a.*p1)();
 (a.*p2)();

运行结果显示这段代码都是调用了A::foo函数,但是打印出来的p1和p2的值确不一样。难道A::foo函数有两个代码段?

以下是我的程序代码:

#include "stdafx.h"
#include <iostream>

using namespace std;

class A
{
public:
 virtual void foo(){ cout<<"foot"<<endl; }
 int x;
};

class B: public A
{
public:
 virtual void bar(){ cout<<"bart"<<endl; }
 };

int main()
{
  A a; B b;
 
 typedef void (A::*MemFun)() ;

 cout<<"test a"<<endl;

 MemFun * vpa = * ((MemFun**)&a );
 //此时vpa是&A::foo
 (a.**vpa)();

 --vpa;
 while(*vpa)
 {
  printf("%pt%pn", vpa, *vpa);
  ++vpa;
 }

 cout<<"test b"<<endl;
 MemFun * vpb = * ((MemFun**)&b );
 //此时vpb是&b::foo 即 &A::foo
 (b.**vpb)();

 ++vpb;
 //此时vpb是&b::bar
 (b.**vpb)();

 --vpb;
 --vpb;
 while(*vpb)
 {
  printf("%pt%pn", vpb, *vpb);
  ++vpb;
 }
 
 printf("&A::foo = %pn", &A::foo);
 printf("&B::foo = %pn", &B::foo);
 printf("&B::bar = %pn", &B::bar);

 MemFun p1 = &A::foo;
 MemFun p2 = ** ((MemFun**)&a );
 printf("p1 = %pt p2 = %pn", p1, p2);
 (a.*p1)();
 (a.*p2)();

 system("pause");
  return 0;
}

最后是运行结果:

test a
foo
00423028 0042770C
0042302C 00411136

test b
foo
bar
0042303C 00427764
00423040 00411136
00423044 0041156E

&A::foo = 00411721
&B::foo = 00411721
&B::bar = 004114D3
p1 = 00411721 p2 = 00411136
foo
foo


[解决办法]
p1 = 00411721 p2 = 00411136

p1是个奇数地址,显然不可能是函数地址。

[解决办法]
哦,看错了,你前次的输出前有个--vpa。p2是对的。p1不清楚是怎么实现的,好像很多编译器&B::f都是返回1的。

热点排行