鱼C论坛

 找回密码
 立即注册
查看: 3065|回复: 3

为什么派生类指针不能指向基类?

[复制链接]
发表于 2012-6-12 16:54:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. class A {........};
  2. class B :public A {......};

  3. A *a = new A;  OK
  4. A *a1 = new B;  OK

  5. B *b = new B;   OK
  6. B *b1 = new A ; ERROR
复制代码
书上说派生类包含基类成员和派生类成员,那照理说应该可以用派生类指针指向new出来的基类,毕竟每个派生类都包含基类的成员

但是实际上,当你用派生类指针指向new出来的基类,却会报错:error C2440: “初始化”: 无法从“A *”转换为“B *”
而用基类的指针就可以指向派生类,求解?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-14 18:26:25 | 显示全部楼层
可以强转啊
但是你想想派生类肯定比基类大
如果指向基类 他有的东西 基类没有 这不就矛盾了?

而基类指针指向派生类 因为派生类都是继承过来的
基类指针->出来的任何东西  都是安全的

不是说不能指向基类 强转可以搞定 但是不安全
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-15 11:41:08 | 显示全部楼层

OK,我明白了,之前一直困惑在派生类包含基类成员这问题上,觉得派生类应该可以指向基类。没想到用指针指向基类有可能访问到基类不存在的成员。
谢咯。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-15 13:16:03 | 显示全部楼层
就比如基类有个成员变量ndata
派生类有个成员变量ndata2
派生类指针指向基类对象
访问ndata2
会访问基类偏移
基类里ndata2偏移有可能正好是ndata
你想访问的是ndata2 实际访问是ndata
看内存布局就知道了

而派生类继承了父类 派生类的内存布局 等于父类内存布局+自己定义的其他空间

所以父类指针访问父类成员 都能找到正确的偏移
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 17:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表