类的继承中指针指向的对象调用重载函数与对象直接调用重载函数有什么区别??

zwklovefy 2007-12-09 06:49:51
#include<iostream.h>

class C0
{
public:
void Set1(int i)
{
cout<<"C0:Set1 i="<<i<<endl;
}
/****found*****/
virtual void Set2(int i)
{
cout<<"C0:Set2 i="<<i<<endl;
}
};
class C1:public C0
{
public:
void Set1(int i)
{
cout<<"C1:Set1 i="<<i<<endl;
}
void Set2(int i)
{
cout<<"C1:Set2 i="<<i<<endl;
/******found******/
//void C0::Set2(int i); 除非是函数的定义,否则不能在函数前加void ,在参数表中加int
C0::Set2(i);

}
};


void main()
{
C0 *p;
C1 obj2;

obj2.Set1(1);
obj2.Set2(2);
/*******found*****/
p = &obj2;

p->Set1(3);//不知道是为什么,这样的布局后,p->Set1(3)指向的是基类的Set1()
//而不是象obj2.Set(1)那样指向的是派生类的Set1();这是为什么??
p->Set2(4);

return;
}
...全文
97 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng19851010 2007-12-09
  • 打赏
  • 举报
回复
呵呵 没事可能是我说的不清楚啊 不知道明白没呢
zwklovefy 2007-12-09
  • 打赏
  • 举报
回复
晕了晕了,不好意思不好意思
cheng19851010 2007-12-09
  • 打赏
  • 举报
回复
晕了这里:C0 *p; 你是把p定义为指向基类的指针了吧。虽然这里p = &obj2;你将派生类的一个对象赋给了这个指针了,但是这个指针的类型还是基类类型吧。如果你调用的函数是虚函数那么在调用的时候会根据指针所指向的类型也就是派生类的类型区调用函数,但是当你调用的函数不是虚函数的时候就会根据指针的的实际类型也就是基类类型区调用。你要搞清楚什么是多态,什么是指针的类型,什么是指针指向的类型。先看看书 吧
zwklovefy 2007-12-09
  • 打赏
  • 举报
回复
明明是p=&obj2,怎么楼上还说是“用基类的指针调用函数”,这不是“用子类的指针”吗?
cheng19851010 2007-12-09
  • 打赏
  • 举报
回复
c++的书上说在基类中的虚函数可以不写virtual????
这是那本书上说的。没有指明virtual的函数只是作为一般的函数,根据继承的不同方式被派生类继承。你可以在派生类中定义和基类中同名的函数,但是这个时候不是多态而是派生类中的函数隐藏了基类中的同名函数,当你使用基类的指针调用函数的时候他会检查你调用的是否为虚函数,如果是的话那么会执行动态绑定,如果不是的话那么它只会根据指针的静态类型(也就是基类的类型)去调用函数
zwklovefy 2007-12-09
  • 打赏
  • 举报
回复
p明明是帮定在子类的对象obj2上的怎么说是帮定在基类上呢?
c++的书上说在基类中的虚函数可以不写virtual ,怎么说在
基类中的Set1()不是虚函数呢?
为什么说用C1直接生成的对象不涉及多态呢?

麻烦各位
zhangyanli 2007-12-09
  • 打赏
  • 举报
回复
同意过儿:
你的不是虚函数所以谁声明的指针,则调用谁,这里没有运行期多态。
cheng19851010 2007-12-09
  • 打赏
  • 举报
回复
因为你的Set1()在基类中并不是一个虚函数,所以即使你用指定派生类的指针去调用这个函数也不存在动态的绑定。它会根据指针的静态类型去调用也就是调用基类的指针。如果要实现动态绑定Set1()那在基类中你也要把它定义为虚函数。
就呆在云上 2007-12-09
  • 打赏
  • 举报
回复
问题在于你的函数的定义的时候一个是virtual的,另个不是的,这样系统“功能下降”,他不能实时指向obj2的函数,如果你的基类函数都是virtual的,就可以看到你要的结果了
独孤过儿 2007-12-09
  • 打赏
  • 举报
回复
两点原因:

1、因为obj2是一个C1直接生成的对象,这个没什么好说的,与多态没有任何的关系。

2、基类中的Set1()函数不是一个虚函数,不具有多态的行为。所以你用一个基类的指针来操纵一个子类的对象,结果仍然是

绑定到基类的对象上
nosafer 2007-12-09
  • 打赏
  • 举报
回复
区别就是一个可能涉及多态,一个根本就不涉及
www.mbsxx.cn

64,642

社区成员

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

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