说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于成员函数地址

编辑:说三道四文库 发布时间:2018-08-20 03:04
HTML文档下载 WORD文档下载 PDF文档下载
#include <stdio.h>
#include <iostream.h>
class a  
{
public:
void virtual f();
};
class b : public a  
{
public:
void virtual f();
};
void a::f()
{
cout<<"a::f()"<<endl;
}
void b::f()
{
cout<<"b::f()"<<endl;
}
void main()
{
typedef void (a::* T1)() ;
typedef void (b::* T2)() ;
T1 p1;
T2 p2;
a a1;
b b1;
p1=a1.f;
p2=b1.f;
printf("%d %d",p1,p2);
//为什么p1与p2相等呢?又没有动态联编,p1与p2应该指向两个不同的函数阿?
}
怎么写成void virtual?

能编译啊?
楼主的代码能通过编译?至少我手头的编译器没有一个不报错的
T1和T2应该是表示函数在虚表中的偏移位置,而不是函数的物理地址,因为函数是虚函数,它们的偏移位置在虚表中是相同的。

应该改成
virtual void f();
这是一个很严重的问题
还有我同意楼上所说的~

darkhawk(hawk)
的意思是说它们的编移是一样的,这个我知道
但楼主的意思应该是说你们有不同的地址,
我觉得那两个函数应该是不同的地址!
学习中,谢谢
我用的是vc++6.0,编译能通过,改成virtual void f()之后结果是一样的,另外,如果是偏移的话也不会那么大吧?我输出的结果是4198445 4198445
up
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘