读书人

打印虚函数表:同一个函数为什么指针不

发布时间: 2012-02-08 19:52:21 作者: rapoo

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

读书人网 >C++

热点推荐