虚函数问题,问为什么我这个程序子类的函数和父类的虚函数地址是一样的,那编译器如何区分??

zhoujiamurong 2005-03-18 05:14:00
#include <iostream.h>
#include <stdio.h>

class ClassA
{
protected:
int a;
public:
int b;
int c;
ClassA(){};
virtual void run()
{
cout<<&a<<endl;
}
};

class ClassB:public ClassA
{


public:
int d;
void run()
{cout<<"派生"<<&a<<endl;}
void go()
{}
};


int main(int argc, char *argv[])
{

ClassA a;
cout<<"父类对象a的地址"<<&a<<endl;
cout<<"父类对象a的成员a的地址";
a.run ();
cout<<"父类对象a的成员b的地址";
cout<<&a.b<<endl;
cout<<"父类对象a的成员c的地址";
cout<<&a.c<<endl;
cout<<"父类对象a的成员函数run的地址"<<endl;
printf("0x00%x",ClassA::run);
cout<<endl;

ClassB a1;
cout<<"子类对象a1的地址"<<&a1<<endl;
cout<<"子类对象a1的成员a的地址";
a1.run ();
cout<<"子类对象a1的成员b的地址";
cout<<&a1.b<<endl;
cout<<"子类对象a1的成员c的地址";
cout<<&a1.c<<endl;
cout<<"子类对象a1的成员d的地址";
cout<<&a1.d <<endl;
cout<<"子类对象a1的成员函数run的地址"<<endl;
printf("0x00%x",ClassB::run);
cout<<endl;
cout<<"子类对象a1的成员函数run的地址"<<endl;
printf("0x00%x",ClassB::go);
cout<<endl;


//void (ClassA:: *p)()=ClassA::run;
//(a.*p)();*/
return 0;
}
...全文
185 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2005-03-20
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3863/3863065.xml?temp=.7807276
并非倒分
tudou614 2005-03-20
  • 打赏
  • 举报
回复
可以看下《深度探索C++对象模型》第1章的图,这里贴不上来!
xxxdg 2005-03-20
  • 打赏
  • 举报
回复
Mark......
zhoujiamurong 2005-03-18
  • 打赏
  • 举报
回复
非常感谢hwablues(hwa)提供的两篇文章,我有更好的理解,但是还是没解决我的疑问
zhoujiamurong 2005-03-18
  • 打赏
  • 举报
回复
我就不信CSDN没有虚函数高手解释一下
zhoujiamurong 2005-03-18
  • 打赏
  • 举报
回复
to Mackz(在相互)
我也怀疑是我得函数地址用法错误,但是改成你这样也是一样的
父类对象a的地址0x0012FF70
父类对象a的成员a的地址0x0012FF74
父类对象a的成员b的地址0x0012FF78
父类对象a的成员c的地址0x0012FF7C
父类对象a的成员函数run的地址
0x00401046
子类对象a1的地址0x0012FF5C
子类对象a1的成员a的地址派生0x0012FF60
子类对象a1的成员b的地址0x0012FF64
子类对象a1的成员c的地址0x0012FF68
子类对象a1的成员d的地址0x0012FF6C
子类对象a1的成员函数run的地址
0x00401046 //地址还是和上面一样
子类对象a1的成员函数run的地址
0x0040105a
Press any key to continue
hwablues 2005-03-18
  • 打赏
  • 举报
回复
虚函数是C++多态性的一种.
希望这两篇文章能解答你的问题:
http://www.vckbase.com/document/viewdoc/?id=299
菜牛 2005-03-18
  • 打赏
  • 举报
回复
printf("0x00%x",a.run);
...
printf("0x00%x",a1.run);
zhoujiamurong 2005-03-18
  • 打赏
  • 举报
回复
我理解得虚函数,先把根据this地址得到虚表地址,然后由虚表项里存放的函数指针地址,访问

相应的函数,那么基类的虚函数和子类对应的函数地址应该不一样,才可以通过函数指针调用

不同的函数
zhoujiamurong 2005-03-18
  • 打赏
  • 举报
回复
应该是this指针指向虚函数表吧
zhoujiamurong 2005-03-18
  • 打赏
  • 举报
回复
谢谢 (怪你过分美丽)
我怎么看得到这张虚函数表,或者用什么方法来证明??
sboom 2005-03-18
  • 打赏
  • 举报
回复
子类和父类虚函数指向同一张虚函数表,在代码运行时才动态绑定。
SevenDrop 2005-03-18
  • 打赏
  • 举报
回复
把结果贴出来看看。
sboom 2005-03-18
  • 打赏
  • 举报
回复
运行时绑定。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧