C++的一个问题--多态的?

bingo_sys 2008-11-20 08:54:10
#include <iostream>
using namespace std;


class eng
{
public:
virtual void work()
{
cout << "working" << endl;
}
void eat()
{
cout << "eat" << endl;
}
};

class softeng : public eng
{
void eat()
{
cout << "softeng eat" << endl;
}

};

class hardeng : public eng
{
void work()
{
cout << "hardeng work" << endl;
}

};



int main()
{
eng *work1 = new softeng();
//output 1
work1->work();
work1->eat();
eng *work2 = new hardeng();
//output2
work2->work();
work2->eat();
eng work3 = *(new softeng());
//output3
work3.work();
work3.eat();

eng work4 = *(new softeng());
//output4
work4.work();
work4.eat();



return 0;
}


能否帮我解释一下output3的输出为什么是working和eat,eng work3 这块内存怎么看,谢谢
...全文
88 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
MilanSpiRiT 2008-11-20
  • 打赏
  • 举报
回复
多态应该只发生在eng *work的时候,即基类指针指向派生类的时候。
如果直接声明的对象eng work,那只是把new出来的派生类对象强制
转换为基类对象,会发生切割,切掉派生类多出的部分。
tianwen_liang 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bingo_sys 的回复:]
eng work4 = *(new hardeng());
//output4
work4.work();
work4.eat();

那这两个怎么解释

能再对照1,2说下么,谢谢
[/Quote]

虚拟函数只是和本类的类型有关系
也就是说
这个实例是什么类型,它就所以哪个函数调用。
work4 是eng的所以就调用 work了

至于eat就没的选择了,就是eat。
zhouqing19871024 2008-11-20
  • 打赏
  • 举报
回复
eng work3 = *(new softeng()); 是把派生类对象赋值给基类对象work3,此时会发生“切割”,派生类比基类多出来的成员(指派生类的eat函数)会被“省略”掉,所以work3.eat(); 调用的是基类的eat函数
由于该派生类没有重新定义函数work,所以work3.work(); 当然是调用基类的work函数,
bingo_sys 2008-11-20
  • 打赏
  • 举报
回复
eng work4 = *(new hardeng());
//output4
work4.work();
work4.eat();

那这两个怎么解释

能再对照1,2说下么,谢谢
帅得不敢出门 2008-11-20
  • 打赏
  • 举报
回复
eng work3 = *(new softeng());
//output3
work3.work(); //这个你的softeng没有覆盖基类的work()所以别无选择
work3.eat(); //这个eat不是virtual 所以编译器根据静态类型调用eng的eat();

65,211

社区成员

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

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