在公有继承情况下,关于指针或引用的思考

-bootblack- 2016-02-24 01:46:12


基类指针可以在不进行显示类型转换的情况下指向派生类对象.
基类引用可以在不进行显示类型转换的情况下引用派生类对象.

摘自:<<C++ primer plus>>
上面的这句话正确吗?
...全文
407 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2016-02-25
  • 打赏
  • 举报
回复
引用 7 楼 fefe82 的回复:
[quote=引用 6 楼 liuchangkk1 的回复:] [quote=引用 5 楼 fly_dragon_fly 的回复:] 没有问题, 你的理解是怎么样的
我知道这个不算是强制类型转换,但是它表达的意义似乎与向下强制类型转换相同. 都是基类指向派生类 是不是我被这2个概念弄糊涂了???[/quote] 强制类型转换会生成临时对象,这里没有。 向下强制类型转换,实际是用基类子对象拷贝构造了一基类临时对象。这个基类临时对象是一个完整的对象,而不是任何一个其他对象的基类子对象。它也不在包含派生类的任何信息。 用基类指针指向派生类对象,指针实际直接指向派生类的基类子对象,没有临时对象生成。通过被指向的基类子对象,还可能找到派生类对象的信息。 基类引用绑定到派生类对象上是同样的过程,没有临时对象生成,是直接绑定到派生类的基类子对象上。[/quote] 不过这里虽然没有对对象进行强制类型转换,但是指针的类型确实发生了类型转换。由派生类的指针转换为了基类的指针。 基类引用绑定到派生类对象的时候没有类型转换发生。基类的引用可以直接绑定到派生类的基类子对象上。
fefe82 2016-02-25
  • 打赏
  • 举报
回复
引用 6 楼 liuchangkk1 的回复:
[quote=引用 5 楼 fly_dragon_fly 的回复:] 没有问题, 你的理解是怎么样的
我知道这个不算是强制类型转换,但是它表达的意义似乎与向下强制类型转换相同. 都是基类指向派生类 是不是我被这2个概念弄糊涂了???[/quote] 强制类型转换会生成临时对象,这里没有。 向下强制类型转换,实际是用基类子对象拷贝构造了一基类临时对象。这个基类临时对象是一个完整的对象,而不是任何一个其他对象的基类子对象。它也不在包含派生类的任何信息。 用基类指针指向派生类对象,指针实际直接指向派生类的基类子对象,没有临时对象生成。通过被指向的基类子对象,还可能找到派生类对象的信息。 基类引用绑定到派生类对象上是同样的过程,没有临时对象生成,是直接绑定到派生类的基类子对象上。
-bootblack- 2016-02-25
  • 打赏
  • 举报
回复
引用 5 楼 fly_dragon_fly 的回复:
没有问题, 你的理解是怎么样的
我知道这个不算是强制类型转换,但是它表达的意义似乎与向下强制类型转换相同. 都是基类指向派生类 是不是我被这2个概念弄糊涂了???
fly_dragon_fly 2016-02-25
  • 打赏
  • 举报
回复
没有问题, 你的理解是怎么样的
yshuise 2016-02-24
  • 打赏
  • 举报
回复
不是强制转换,而是怎么样规定 的!
ztenv 版主 2016-02-24
  • 打赏
  • 举报
回复
引用 2 楼 liuchangkk1 的回复:
[quote=引用 1 楼 lianshaohua 的回复:] 为什么不正确? 比如: class A{}; class B:public A{}; A* pa=new B();//基类指针pa可以在不进行显示类型转换的情况下指向派生类对象 new B()
那这个算不算向下强制类型转换啊?downcasting[/quote] 类型没有发生转换呀!!!!!!!
-bootblack- 2016-02-24
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
为什么不正确? 比如: class A{}; class B:public A{}; A* pa=new B();//基类指针pa可以在不进行显示类型转换的情况下指向派生类对象 new B()
那这个算不算向下强制类型转换啊?downcasting
ztenv 版主 2016-02-24
  • 打赏
  • 举报
回复
为什么不正确? 比如: class A{}; class B:public A{}; A* pa=new B();//基类指针pa可以在不进行显示类型转换的情况下指向派生类对象 new B()
在国际象棋中,学会如何移动棋子只能算是入门:要想掌控整个棋局,我们必须了解自己所下的每一步棋后的策略和战术。在C++中也同样如此。掌握正确的策略可以帮助我们避免常见的陷阱,并提高我们的工作效率。在本书中,C++专家Rob Murray就与我们分享了他宝贵的经验和建议,以帮助初中级C++程序员得到进一步的提高。 在本书中,作者大量采用了实际开发中的代码来作为示例,向读者展示了那些有用的编程策略,并对那些有害的做法进行了警示。为了帮助读者更好地理解,在书中的每一章结束前,在该章中被介绍过的主要内容都被放到了一个列表中,此外,书中还给出了一些问题来激励读者们进行更多的思考和讨论。 本书在一开始就向我们讲解了如何为我们的设计选择正确的抽象,提示我们注意抽象和现实之间的区别。然后,我们就将学到如何将已得到的抽象转化成一个(或多个)C++中的类,期间进行的讨论所涵盖的范围上至高层的设计策略,下至底层的接口和实现细节。 接下来本书对单继承和多重继承进行了深入的探索。一开始书中会给出一个关于它们应该用在设计的什么地方的讨论,然后就是一些详细的示例代码,用来向我们演示如何在实践中使用这些概念。对于 mulu 代译者序 序 第0章 简介 0.1 关于示例代码 0.2 本书的组织 0.3 问题 0.4 语言规则 第1章 抽象 1.1 有关电话号码的抽象模型 1.2 抽象模型间的关系 1.3 请考虑边界条件 1.4 使用CRC卡片来辅助设计 1.5 小结 1.6 问题 第2章 类 2.1 构造函数 2.2 赋值 2.3 公用数据 2.4 隐式类型转换 2.5 操作符重载:成员或非成员? 2.6 重载、缺省值以及省略符 2.7 Const 2.8 返回值为引用 2.9 静态对象的构造 2.10 小结 2.11 问题 第3章 句柄 3.1 一个String类 3.2 使用计数器来避免多份拷贝 3.3 避免进行重编译:Cheshire Cat 3.4 使用句柄来隐藏设计 3.5 多种实现 3.6 作为对象的句柄 3.7 综述 3.8 小结 3.9 问题 第4章 继承 4.1 is-a关系 4.2 公有继承 4.3 私有继承 4.4 保护型继承 4.5 与基类抽象的一致性 4.6 纯虚函数 4.7 有关继承的细节和陷阶 4.8 小结 4.9 问题 第5章 多重继承 5.1 作为交集的多重继承 5.2 虚基类 5.3 一些有关多重继承的细节问题 5.4 小结 5.5 问题 第6章 考虑继承的设计 6.1 被保护的接口 6.2 我们的设计是否应该考虑到继承? 6.3 一些为继承所做的设计的例子 6.4 结论 6.5 小结 6.6 问题 第7章 模板 7.1 模板类Pair 7.2 一些有关模板的细节 7.3 模板的实例化 7.4 智能指针 7.5 作为模板参数的表达式 7.6 模板函数 7.7 小结 7.8 问题 第8章 模板的高级用法 8.1 使用了模板的容器类 8.2 示例:Block 8.3 有关Block的设计细节 8.4 带有迭代器的容器:List 8.5 迭代器的设计细节 8.6 性能上的考虑 8.7 对模板参数的限制 8.8 模板特化 8.9 小结 8.10 问题 第9章 重用 9.1 发现和获得 9.2 健壮性 9.3 内存管理 9.4 可选的内存分配方案 9.5 传递参数给operator new 9.6 管理外部资源 9.7 寻找有关内存的bug 9.8 名字冲突 9.9 性能 9.10 不要去猜想,而应该度量! 9.11 算法 9.12 动态内存分配中的瓶颈 9.13 内嵌 9.14 Tiemann法则 9.15 小结 9.16 问题 第10章 异常 10.1 一个负面的声明 10.2 为什么需要异常? 10.3 一个异常的例子 10.4 异常只应该用来表述异常情况 10.5 理解异常 10.6 责任评估 10.7 设计异常对象 10.8 小结 10.9 问题 第11章 向C++移植 11.1 选择使用C++ 11.2 采用C++ 11.3 设计和实现 11.4 开发一个坚实的基础 11.5 相关的思考 11.6 小结 11.7 问题

64,318

社区成员

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

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