🥒有关继承的思考
2022-6-10
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

容器与继承

当使用容器存放继承体系中的对象时,通常必须采用间接存储的方式。
因为不允许在容器中保存不同类型的元素,所以不能把具有继承体系关系的多种类型的对象直接存放在容器当中。
当派生类对象被赋值给基类对象时,其中的派生类部分将被“切掉”,因此容器和存在继承关系的类型无法兼容。
 
在容器中放置(智能)指针而非对象
当希望在容器中存放具有继承关系的对线时,实际上存放的是基类的指针(更好的选择是智能指针),这些指针所指对象的动态类型可能是基类类型,也可能是派生类类型:
basket存放着shared_ptr,解引用basket.back()的返回值以获得运行net_price的对象,通过在net_price的调用中使用->以达到这个目的。实际调用的net_price版本依赖于指针所指对象的动态类型。可以将一个派生类的普通指针转换成基类指针,也能把一个派生类的普通指针转换成基类的智能指针。
 

继承和组合

  • public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象
  • 组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象
  • 优先使用对象组合,而不是类继承
  • 继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用 (white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。 继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关 系很强,耦合度高。
  • 对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对 象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse), 因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。 组合类之间没有很强的依赖关系, 耦合度低。优先使用对象组合有助于你保持每个类被封装。
  • 实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合。
 
⬛ 黑箱复用:C对象公有成员D可以直接用,C对象保护成员D不能直接用。
⬜ 白箱复用:C对象公有成员D可以直接用,C对象保护成员D也可以直接用。
  • C++
  • 多重继承与虚继承运行时类型识别
    目录