关于C++继承概念的思考

-bootblack- 2016-03-16 11:38:35
加精
1>在公有继承,保护继承,私有继承中都可以使用隐式的向上类型转换(换句话说,基类指针或者引用可以指向派生类对象).,这个理解正确吗?
2>摘自<<C++ primer plus> 只能将RTTI用于包含虚函数的层次结构,原因在于这种类层次结构,才应该将派生对象的地址赋给基类指针
小弟对这句话不是很理解~
小弟以为:将派生对象的地址赋给基类指针是属于从派生类转换到基类,是应该隐式调用向上类型转换的.这个理解正确吗?
而这里特意指出需要虚函数,(难道在虚函数类中才可以使用隐式向上类型转换,这个不对啊?)这到底是为什么?
恳请大神赐教~~~
...全文
1984 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
洪章桔 2016-12-20
  • 打赏
  • 举报
回复
私有公有保护。分清它们之间的概念,还是不容易出错的。派生类也是概念问题
taxue505 2016-05-25
  • 打赏
  • 举报
回复
请深入阅读《深度探索C++对象模型》 里边很详细
lm_whales 2016-03-23
  • 打赏
  • 举报
回复
从语言上说 所有继承都是 is_a 但是从开发上说 公有继承是 is_a 私有继承是 implement_in_terms_of
blueink_200451 2016-03-23
  • 打赏
  • 举报
回复
donwmufromdying 2016-03-22
  • 打赏
  • 举报
回复
楼主,这就是一个is-a的关系。简单来说:派生类首先是一个基类。不过派生类还有一些自己的东西
-bootblack- 2016-03-22
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
从语法上讲,只要是继承关系,就可以用基类指针或引用指向派生类对象。 从代码设计上讲,该不该这样做,这样做好不好,还要具体问题具体问题。
大神神武~
xzz_sam 2016-03-21
  • 打赏
  • 举报
回复
引用 12 楼 cqh963852 的回复:
[quote=引用 9 楼 CharlesSimonyi 的回复:] 从语法上讲,只要是继承关系,就可以用基类指针或引用指向派生类对象。 从代码设计上讲,该不该这样做,这样做好不好,还要具体问题具体问题。
正解[/quote] 正解,继承是is-a关系,派生类的对象同时也是基类的对象,比如: Base* b; Derived D: B {} D d; 那么b是一个指向基类对象的指针,但是既然D也是一个B,那么,就可以: b = &d; 这样,你可以把一个D作为一个b来使用而不会出现问题。与virtual不virtual的没有关系。 你书上说要加virtual,肯定是与你的具体的讲述环境有关系,通常讲,基类会将希望其子类能够override的函数标记为virtual。
encoderlee 版主 2016-03-18
  • 打赏
  • 举报
回复
正确
pengzhixi 2016-03-18
  • 打赏
  • 举报
回复
为什么特意强调下虚函数,因为有虚函数就有虚函数表,有虚函数表那么就可以将类型信息放虚函数表里面。只能说将类型信息放虚函数表是rtti实现的一种手段。
encoderlee 版主 2016-03-18
  • 打赏
  • 举报
回复
从语法上讲,只要是继承关系,就可以用基类指针或引用指向派生类对象。 从代码设计上讲,该不该这样做,这样做好不好,还要具体问题具体问题。
-bootblack- 2016-03-18
  • 打赏
  • 举报
回复
引用 7 楼 CharlesSimonyi 的回复:
正确
引用 7 楼 CharlesSimonyi 的回复:
正确
大神:再请教下 是不是说针对is-a关系的,这个都都成立(在公有继承,保护继承,私有继承中都可以使用隐式的向上类型转换(换句话说,基类指针或者引用可以指向派生类对象).?
cqh963852 2016-03-18
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
从语法上讲,只要是继承关系,就可以用基类指针或引用指向派生类对象。 从代码设计上讲,该不该这样做,这样做好不好,还要具体问题具体问题。
正解
cqh963852 2016-03-18
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
这里有一个大坑,就看楼主敢不敢往里跳了: 《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
这个坑好大。。。。。。
nmgwddj 2016-03-17
  • 打赏
  • 举报
回复
1、在C++中基类指针指向子类对象称为“赋值兼容”,这是C++的特性之一,无需做显示的类型转换,这也是实现多态的必要条件之一。 2、特意指出虚函数的原因又是在描述C++的多态特性。实现C++的多态要有以下三个条件。 1) 父类提供虚函数 2) 子类覆写父类虚函数 3) 使用父类指针指向子类对象,并调用虚函数方法。 以上三个步骤实现了多态,就是使用父类指针再调用虚函数的时候,实际是执行了子类覆写的函数代码段。在C++中封装了一层虚函数表用以实现多态。实际就是用的C中回调函数的特性。 推荐你看个将 C++ 特别好的视频课程,在腾讯课堂。这是我看过的讲 C++ 最通俗易懂、最透彻的课程了。 http://ke.qq.com/course/115806#term_id=100125780
赵4老师 2016-03-17
  • 打赏
  • 举报
回复
这里有一个大坑,就看楼主敢不敢往里跳了: 《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
-bootblack- 2016-03-17
  • 打赏
  • 举报
回复
那请问大神:我的第一个理解正确吗?
encoderlee 版主 2016-03-17
  • 打赏
  • 举报
回复
C++ primer plus中这句话的意思是:如果一个父类中有虚函数,才应该将子类对象的地址赋给父类指针,如果父子类中没有虚函数,用不了多态功能,为何要将子类对象的地址赋给父类指针呢? 简单来说就是:如果类中没有虚函数,不应该用父类指针指向子类对象
difkg1 2016-03-17
  • 打赏
  • 举报
回复
《MFC深入浅出》,内有RTTI模拟。
difkg1 2016-03-17
  • 打赏
  • 举报
回复
《MFC深入浅出》。

64,637

社区成员

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

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