美文网首页
Effective C++ 学习备忘录六

Effective C++ 学习备忘录六

作者: 仰简 | 来源:发表于2022-04-11 21:37 被阅读0次

    继承与面向对象设计

    • 条款 32 - 确定你的 public 塑模出 is-a 关系
    • "public继承" 意味 is-a。适用于 base classes 身上的每一件事情也一定适用于 derived classes 身上,因为每一个 derived classes 对象也都是一个 base classes 对象。
    • 条款 33 - 避免遮掩继承而来的名称
    • derived classes 内的名称会遮掩 base classes 内的名称,在 public 继承下,从未有人希望如此。
    • 为了让遮掩的名称再见天日,可使用 using 声明式或转交函数。
    • 条款 34 - 区分接口继承和实现继承
    • 接口继承与实现继承不同,在 public 继承之下, derived classes 总是继承 base classes 的接口。
    • pure virtual 函数只具体指定接口继承。
    • 简朴的 impure virtual 函数具体指定接口继承及缺省实现继承。
    • non-virtual 函数具体指定接口继承及强制性实现继承。
    • 条款 35 - 考虑 virtual 函数以外的其它选择
    • virtual 函数的替代方案包括 NVI 手法以及 Strategy 设计模式的多种形式,NVI 手法自身是一个特殊形式的 Template Method 设计模式。
    • 将机能从成员函数移到 class 外部函数,带来的一个缺点是非成员函数无法访问 class 的 non-public 成员。
    • tr1::function 对象的行为就像一般函数指针,这样的对象可接纳与给定之目标签名式兼容的所有可调用物。
    • 条款 36 - 决不重新定义继承而来的 non-virtual 函数
    • 绝对不要重新定义继承而来的 non-virtual 函数
    • 条款 37 - 决不重新定义继承而来的缺省函数参数值
    • 绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而 virtual 函数——你唯一需要复写的东西——却是动态绑定的
    • 条款 38 - 通过复合塑模出 has-a 或根据某物实现出
    • 复合的意义和 public 继承完全不同
    • 在应用域,复合意味 has-a,在实现域,复合意味 is-implemented-in-term-of
    • 条款 39 - 明智而审慎地使用 private 继承
    • private 继承意味 is-implemented-in-terms-of,它通常比复合的级别低,但是当 derived class 需要访问 protected base class 的成员,或需要重新定义继承而来的 virtual 函数时,这么设计是合理的。
    • 和复合不同,private 继承可以造成 empty base 最优化,这对致力于 “对象尺寸最小化” 程序库的开发者而言,可能很重要。
    • 条款 40 - 明智而审慎地使用多重继承
    • 多重继承比单一继承复杂,它可能导致新的岐义性,以及对 virtual 继承的需要。
    • virtual 继承会增加大小、速度、初始化复杂度等等成本。如果 virtual base class 不带任何数据,将是最具实用价值的情况。
    • 多重继承的确有正当用途,其中一个情节涉及 “public 继承某个 Interface class” 和 “private 继承某个协助实现的 class” 的两者相结合。

    相关文章

      网友评论

          本文标题:Effective C++ 学习备忘录六

          本文链接:https://www.haomeiwen.com/subject/xhwejrtx.html