请教函数覆盖问题

zengjing0806 2009-02-20 01:00:24

不好意思只剩18分了.
代码在dev4992中运行正常;
问题:caa类中caa::fcout(int)覆盖父类中的ca::fcout(int),故其虚函数表中没有ca::fcout(int);
那么像p->ca::fcout(2);q->ca::fcout(4);bbb.ca::fcout(8);是如何调用到ca::fcout(int)的?


class ca
{
public:
virtual void fcout(int a){cout<<"ca::"<<a<<endl;}
};

class caa:public ca
{
public:
void fcout(int x){cout<<"caa:"<<x<<endl;}
};

int main(int argc, char *argv[])
{
caa bbb;
ca *p=&bbb;
caa *q=&bbb;
p->fcout(1);//此处调用caa::fcout(int)
p->ca::fcout(2);//调用ca::fcout(int)
q->fcout(3);//调用caa::fcout(int)
q->ca::fcout(4);//调用ca::fcout(int)
bbb.ca::fcout(8);//调用ca::fcout(int)
system("PAUSE");
return EXIT_SUCCESS;
}
...全文
162 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2009-02-20
  • 打赏
  • 举报
回复
当你用对象调用时就传递对象的地址,用指针调用时就直接传指针进去。
pengzhixi 2009-02-20
  • 打赏
  • 举报
回复
实际上成员函数的调用和普通函数的使用一样。调用成员函数的时候实际上是传递了this指针做为函数参数的。
waizqfor 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zengjing0806 的回复:]
谢谢二位.
这个问题明白了,另有一个更基本点的问题:

类对象是如何调用到成员函数的?
类成员函数应该和全局函数存放在一起吧.
那如果全局函数和类成员函数同名,类对象调用成员函数的时候,系统如何保证调用的是类成员函数?
类对象本身的存储里似乎没有成员函数的任何信息.
[/Quote]
这个LZ需要看看类的成员函数的存储关系
http://community.csdn.net/Expert/topic/3403/3403559.xml?temp=.2273371
http://community.csdn.net/Expert/topic/3345/3345359.xml?temp=7.061404E-02
LZ看看这个地址
a_rockboy 2009-02-20
  • 打赏
  • 举报
回复
一来函数名改了,二来类成员函数隐含传入了一个this指针参数。
zengjing0806 2009-02-20
  • 打赏
  • 举报
回复
呵呵.
明白了.
编译时候已经函数名字改了.
zengjing0806 2009-02-20
  • 打赏
  • 举报
回复
谢谢二位.
这个问题明白了,另有一个更基本点的问题:

类对象是如何调用到成员函数的?
类成员函数应该和全局函数存放在一起吧.
那如果全局函数和类成员函数同名,类对象调用成员函数的时候,系统如何保证调用的是类成员函数?
类对象本身的存储里似乎没有成员函数的任何信息.
a_rockboy 2009-02-20
  • 打赏
  • 举报
回复
哦。。是,楼主把我绕糊涂了,呵。caa的fcout还是虚函数。
pengzhixi 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 a_rockboy 的回复:]
-----------------caa类中caa::fcout(int)覆盖父类中的ca::fcout(int),故其虚函数表中没有ca::fcout(int);
这是不对的,虚函数表中有ca::fcout(int),虚函数表属于类实体。
q->fcout(3);//调用caa::fcout(int)
此时编译器连接的是caa::fcout(int),是一个实函数。实函数是独立于类实体存在的。
ls的搞错了caa::fcout(int)这还是以个虚函数
[/Quote]

至于p->ca::fcout(2);为什么会调用ca::fcout(2)这是因为你这样写属于静态绑定了,p就不会动态绑定了。
a_rockboy 2009-02-20
  • 打赏
  • 举报
回复
-----------------caa类中caa::fcout(int)覆盖父类中的ca::fcout(int),故其虚函数表中没有ca::fcout(int);
这是不对的,虚函数表中有ca::fcout(int),虚函数表属于类实体。
q->fcout(3);//调用caa::fcout(int)
此时编译器连接的是caa::fcout(int),是一个实函数。实函数是独立于类实体存在的。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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