Effective C++ 随记 第六章(继承于面向对象设计)

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

请记住:

1):”public 继承“意味着 is-a。适用于 base class 身上的每一件事一定也适用于 derived class。因为每一个derived class 对象也是一个 base class 对象。

 

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

由于 名称 的作用域原因,没有重载的同名成员会使得 base class 对象内的名称被遮掩。

virtual void mf1()   //转交函数

{ base::mf1(); }   // 转交函数中调用基类的 mf1 函数,使得其 隐式 成为 inline 函数。

请记住:

1):derived class 内的名称会遮掩 base class 内的名称,在 public 继承下没人希望如此。

2):为了让被遮掩的名称再次可用,可以使用 using 声明式或者转交函数。

 

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

接口继承:只继承函数的声明;实现继承:继承函数的定义。

下述分类只针对 public 继承:
仅继承接口: 纯虚(pure virtual)函数 - virtual void draw() const = 0;

②继承接口和缺省实现: 虚(virtual)函数 - virtual void draw()const;

可以重新定义自己的函数实现。

③继承接口和实现:non-virtual函数 - void draw(); 实现不可重载。

 

请记住:

1):接口继承和实现继承不同,public 继承下 drived class 总时继承 base class 的接口。

2): 上述三种详细的 接口和实现 继承分类。

 

条款35:考虑 virtual 函数以外的其他选择

请记住:

1):virtual 函数的替代方案包括 NVI 手法及Strategy 设计模式的多种形式。NVI 手法自身是一种特殊的 Template Method 设计模式

2):将机能从成员函数转移到 class 外部函数带来一个缺点:非成员函数无法访问 非公有成员。

3):tr1::funtion 对象行为就像一般函数指针。这样的对象可接纳“与给定目标签名式兼容“的所有可调用物。

 

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

静态绑定:声明类型; 动态绑定:(指针、引用)实际指向的类型。

请记住:

1):绝不重定义继承而来的 non-virtual 函数

 

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

参数值由静态定义产生;

指针或者引用指向的对象的实体为动态类型。

对象和参数的调用可能分别来自 派生类和基类。

请记住:

1):绝对不要重定义继承而来的缺省参数值,缺省值由静态绑定;virtual 函数(需要覆盖的东西)动态绑定。

 

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

请记住:

1):复合的意义和 public 继承完全不同。

2):在应用域,复合意味 has-a(有一个)。在实现域,复合意味着 is-implemented-in-terms of(根据某物实现出))。

 

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

请记住:

1):private 继承意味着 is-implemented-in-terms of(根据某物实现出),通常比复合的级别低。

可用于:在 derived class 需要访问 protected base class 成员 或需要重新定义继承而来的 virtual 函数时。

2):与复合不同,private 继承可以使得 empty base (空基类)最优。有利于“对象尺寸最小化”。

 

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

请记住:

1):多继承比单一继承复杂。可能导致新的歧义性,也可能需要 virtual 继承。

2):virtual 继承会增加大小、速度、初始化(赋值)复杂度等成本。如果 virtual base class 不带任何数据,将最具有实用价值。

3)多重继承的正当用途:涉及”public继承某个interface class“ 和”private 继承协助实现的class“相结合。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值