effective c++ 06 --继承与面向对象设计

东阳的学习记录

条款32:确定你的public继承塑模出 “is-a”关系

  1. 正方形并不是矩形
  2. “is-a”意味着:适用于base class 身上的每一件事情也一定适用于 derived class 。

条款33:避免遮掩继承而来的名称

  1. 如果你正在使用 public 继承,又不继承那些重载函数,就是违反了 is-a
  2. 适用using声明,使得 base 的函数可见
  3. 在private继承下,是可以不满足 is-a 关系的
  4. 使用 转交函数 继承某个特定版本

条款34:区分接口继承与实现继承

  1. 缺省的 virtual 实现在现实需求发生改变时可能会造成危险
  2. 正确的方法是切断 “virtua函数接口”和“缺省实现之间的练习”
  3. non-virtual 函数不应该在派生类中被重新定义
  4. 不用过分担心 virtual 函数的成本,谨记80-20法则
  5. 对于预期不应该在 derived 中重复定义的函数,应该定义为 non-virtual

条款35:考虑 virtual 之外的其他选择

  1. NVI:令客户通过 public non-virtual 成员函数调用 private 虚函数
  2. NVI手法的一个优点便是可在外覆器中对virtual进行前戏和收尾工作
  3. 适用函数指针代替虚函数,或可调用对象,实现自定义的操作
  4. 古典模式:将继承体系中的 virtual 替换成另一个继承体系中的 virtual

条款36:绝不重新定义继承而来的 non-virtual 函数

  1. 当重新定义继承来的非虚函数时,此时用基类指针调用和派生类指针调用时,会出现不同结果
  2. 任何情况下都不应该重新定义

条款37:绝不重新定义继承而来的缺省参数值

  1. 静态绑定下,并不从其 base 继承缺省参数值
  2. 适用NVI模式,可避免这种麻烦

条款38:根据复合塑模出 “has-a” 或 “根据某物实现出”

  1. has-a:人有一个地址,一个电话
  2. is-implemented-in-term-of:比如用list可以实现set,表现为一个特例,例如正方形可以用矩形实现,但正方形不是矩形

条款39:明智而审慎地使用private继承

  1. 尽可能采用复合,除非复合无法满足需求时采用private继承
  2. 当 derived class 需要访问 protected 成员,或者需要重新定义继承而来的虚函数时,才使用private继承
  3. EBD空白基类最优化时,才使用private继承

条款40:明智而审慎地使用多重继承

  1. 多重继承带来函数调用的歧义
  2. virtual 继承必须付出代价
  3. virtual base的初始化由继承体系中最底层的 class 负责
  4. 作者建议:
    i. 非必要不使用 virtual base
    ii. ==若使用,尽可能避免在其中放置数据,这样一来,就不用担心在其上初始化(赋值)所带来的诡异事情了 ==
  5. 多重继承的确有其正当用途。比如, public继承某个 interface, private继承某个协助实现的 class
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东阳z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值