打印虚函数表::同一个函数为什么指针不一样
昨天摩根斯坦利笔试受了点刺激,回来小小研究了一下虚函数表。今天写了一个输出虚函数表的程序。经过测试,在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的。