(1).为何父类对象不能转化为子类对象,而父类指针可以强制转换为子类指针??

(2).为何父类指针转换为子类指针需要显式转换而子类指针转换为父类指针不用显式转换??例:(1)classA{};//父类classB:publicA{};//子类Aa;... (2).为何父类指针转换为子类指针需要显式转换而子类指针转换为父类指针不用显式转换??

例:(1)
class A{}; //父类
class B: public A
{};//子类
A a;//父类对象
B b;//子类对象
A *Pa;//父类指针
B *Pb;//子类指针

Pb=(Pb *)Pa; 合法
b=a; 非法

Pa=Pb; 合法
Pb=Pa; 非法
Pb=(Pb*)Pa; 合法

请高人解释!!!!!!
展开
 我来答
itoyou
2011-09-19 · 超过16用户采纳过TA的回答
知道答主
回答量:161
采纳率:0%
帮助的人:52.5万
展开全部
对象之间不能相互赋值。就好比教师类对象赋值给学生类对象,没有可赋值性。
而指针具有可赋值性。指向教师类的指针,指向学生类的指针。如果两者赋值的话,意思是两个指针指向同一个对象。

顺便说下:

1,直接用基类指针引用基类对象
2,直接用派生类指针引用派生类对象
3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的,
但是只能引用基类成员。若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)
4,用派生类指针引用基类的对象。这种引用方式会导致语法错误。派生类指针必须先强制转换为基类指针,这种方法是不安全的。
追问
貌似有些问题呢 
1.对象之间是可以赋值的啊
比如累的拷贝构造函数 和 等号的重载
就是为了对象之间的相互复制用的啊
2.基类的指针转化为派生类的才需要显式转化的吧
而派生类指针转化为基类指针是不需要转化的吧
请您试试 貌似是这样的
危献e3
2011-09-20 · TA获得超过2053个赞
知道大有可为答主
回答量:2738
采纳率:0%
帮助的人:1959万
展开全部
这个太简单了吧 一只鸡必然是是一个动物 一个动物不一定是一只鸡啊
当编译器知道这是一个动物的时候 你得告诉他 这个动物是鸡 它才能让这只鸡吃小米啊
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
丶夜有所梦baby
2018-02-20
知道答主
回答量:2
采纳率:0%
帮助的人:1656
展开全部
      1. 首先对象之间的转换

        • 子类对象转换为父类对象

          有赋值兼容性原则 ,所以 可以转换成功。内容如下:

        子类对象可以当作父类对象使用

        子类对象可以直接赋值给父类对象

        子类对象可以直接初始化父类对象

        父类指针可以直接指向子类对象

        父类引用可以直接引用子类对象

        • 父类对象转换为子类对象

        编译器角度:C++编译器并不支持这种语法

        理论角度:和”猫是动物,而动物不一定是猫” 一样的

        2.其次对象指针之间的转换

        • 所有的指针间都可以强制转换 (显式转换)。这个要程序员把控转换后对程序的影响。关于指针的理解:

        指针本身是一个变量,它的类型可以是基础类型(char、int、long....),或者是类类型(如Vector、list、map的对象)。无论指针的数据类型是怎样的,本质就是存储了一个地址(如0x112233),所占用的内存单元是4个字节(32位系统)。转换后只是改变了指针的步长。但是存储的地址是一样的。

        • 至于为什么子类转换为父类不需要显式转换,参考赋值兼容性原则。因为编译器内部是支持的。而且编译器可以把控转换后的影响。


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式