C++问题,求大神指点 不理解这个:赋值兼容原则(派生类对象是基类对象,反之不成立)

基类与派生类之间的关系–赋值兼容原则(派生类对象是基类对象,反之不成立)–基类指针强制转换成派生类指针–派生类中重定义基类成员(同名覆盖)... 基类与派生类之间的关系

–赋值兼容原则(派生类对象是基类对象,反之不成立)
–基类指针强制转换成派生类指针
–派生类中重定义基类成员(同名覆盖)
展开
 我来答
Bk0X
2012-07-04 · TA获得超过9413个赞
知道小有建树答主
回答量:1217
采纳率:60%
帮助的人:658万
展开全部
假设, 一个基类 "普通人", 一个派生类 "超人".

1) 赋值兼容原则(派生类对象是基类对象,反之不成立)

超人是人吧, 但不是每个人都是超人.
现在我要找一个普通人来干活.
Man* p = new Man; // OK, p指向了一个普通人对象.
Man* p = new SuperMan; // 也OK, 虽然有些大才小用, 但是超人确实可以胜任普通人的工作.
反过来的话.
SuperMan* sp = new Man; // No, 错误, 我需要一个超人, 普通人无法胜任..

2) 基类指针强制转换成派生类指针.

基类指针不可以直接转换成派生指针.
因为你如果准备让普通人(基类)去做超人(派生类)的工作, 是非常危险的, 所以语法不允许.
但是, 由(1)我们知道超人有可能隐藏在普通人之间的(指针是Man*, 但实际对象是SuperMan).
在你确切知道他实际上是超人的时候, 那么可以使用"强制转化", 让他去做超人的事情.
但是, 如果他真的只是普通人, 那么"强制转换"的后果是不确定的, 很可能会引发运行错误.
Man* p = new SuperMan; // 虽然是Man*, 但实际是SuperMan.
((SuperMan*)p)->Fly(); // "强制转换"之后调用 Fly(飞行)函数.
Man* p = new Man; // 真的只是普通人.
((SuperMan*)p)->Fly(); // 语法可以通过, 但是运行阶段很可能会出现莫名其妙的错误.

(3) 派生类中重定义基类成员
成员函数前加virtual表示虚函数, 意味着派生类可能会有自己的特殊实现.
比如说"看"Look这个动作, 普通人只是用肉眼看, 但是超人用红外线看东西.
class Man{ virtual void Look(){ // 正常人看的代码.} };
class SuperMan: public Man{ virtual void Look(){ // 红外线 }};

SuperMan中的Look前面加不加virtual都可以, 意思不会变.
Man* p = new ManSuper;
p->Look() // 红外线, 虽然用Man*调用函数, 但是由于是虚函数, 会自动定位到ManSuper::Look上

打了这么多字我还真是蛋疼呐..
wziwen1
2012-07-04 · 超过20用户采纳过TA的回答
知道答主
回答量:93
采纳率:0%
帮助的人:46.5万
展开全部
比如有两个类Father和children,其中children类从Father派生,现在用children类产生一个对象child,那么child的类型既是children类型,也是Father类型
反之不成立的意思就是说,用Father类产生一个对象Fa,那么Fa的类型是Father型的,但不是children类型的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式