Effective C++ 读书笔记(六) 继承与面向对象设计
来源:互联网 发布:地图绘制软件中文版 编辑:程序博客网 时间:2024/05/29 03:07
条款32:确定你的pubilc继承塑模出is-a关系
Make sure public inheritance models “is-a”
– C++进行(OOP)面向对象编程,最重要的一个规则是:public inheritance (公开继承)意味“is - a”(是一种)关系。
– 如果你令class D(“derived”)以public形式继承class B(“Base”),你便是告诉编译器: 每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。
– “pubilc继承”意味is-a。适用于Base classes身上的每一件事情一定也是用于Derived classes 身上,因为每一个Derived class对象也都是一个Base Class对象。
条款33:避免遮掩继承而来的名称
Avoid hiding inherited names.
– Derived classes内的名称会隐藏Base classes内的名称。
– 为了能让被隐藏的名称可以使用,可用using声明式或(转交函数)。
条款34:区分接口继承和实现继承
Differentiate between inheritance of interface and inheritance ofimplementation
– Pure virtual函数有两个最突出的特性:它们必须被任何“继承它们”的具象class重新声明,而且它们在抽象class(基类)中通常没有定义。
• 声明一个purevirtual函数的目的是为了derived classes只继承函数接口。
• 声明一个impurevirtual函数的目的,是让derived classes继承该函数的接口和缺省实现。
• 声明non-virtual函数的目的是为了令derivedclasses继承函数的接口及一份强制性实现。
– 接口继承和实现继承不同。在pubilc继承下,derivedclasses总是继承Base class 的接口。
– Pure virtual函数只具体指定接口继承。
– Impure virtual 函数具体指定接口继承及缺省实现继承。
– Non-virtual函数具体指定接口继承以及强制性实现继承。
条款35:考虑virtual函数以外的其他选择
Consider alternative to virtual functions.
– 使用non-virtualinterface(NVI)手法,那是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问性(private 或protected)的virtual函数。
将virtual函数替换为“函数指针成员变量”。将功能从成员函数移到class外部函数,带来一个缺点是,非成员函数无法访问class的non-public成员
条款36:绝不重新定义继承而来的non-virtual函数
Never redefine an inherited non-virtual function.
– 绝对不要重新定义继承而来的non-virtual函数。
条款37:绝不重新定义继承而来的缺省参数值
– Nerver redefine a function’s inherited default prameter value.
– 绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数-----你唯一应该复写的东西-------却是动态绑定。
条款38:通过复合塑模出has-a或“根据某物实现出”
Model “has-a” or “is-implemented-in-terms-of”through composition.
– 复合(composition)是类型之间的一种关系,当某种类型的对象内含它种类型的对象,便是这种关系。
– 复合(composition)的意义和public继承完全不同。
– 在应用域(applicationdomain),复合意味has-a(有一个)。在实现域(implementation domain),复合意味is-implemented-in-terms-of(根据某物实现出)。
条款39:明智而审慎地使用private继承
Use private inheritance judiciously.
– 如果classes之间的继承关系是private,编译器不会自动将一个derivedclass对象转换为一个Base class对象。
– Private base class继承而来的所有成员,在derived class中都会变成private属性。
c++裁定凡是独立(非附属)对象都必须有非零大小。勒令默默安插一个char到空对象内。
EBO(空白基类最优化):
class Empty();
class HoldsAnInt : private Empty
{
private:
int x;
}
sizeof(HoldsAnInt) == sizeof(int);
条款40:明智而审慎的使用多重继承
Use multiple inheritance judiciously
– 多重继承比单一继承复杂。它可能导致新的歧义性,以及对virtual继承的需要。
– Virtual继承会增加大小、速度、初始化(及赋值)复杂度等等成本。
– 多重继承的确有正当用途。其中一个情节涉及“public继承某个Interface class”和“private继承某个协助实现的class”的两相结合
- Effective C++ 读书笔记(六) 继承与面向对象设计
- Effective C++(六)继承与面向对象设计
- <<Effective C++>> 读书笔记6: 继承与面向对象设计
- Effective C++(六)继承与面向对象设计
- Effective C++(六)继承与面向对象设计
- [Effective C++] 继承与面向对象设计
- 《Effective C++》继承与面向对象设计
- effective C++读书笔记六 —— 继承与面向对象设计
- Effective C++读书笔记---继承与面向对象设计
- Effective C++读书笔记 第六部分 继承与面向对象设计
- Effective C++之六:继承与面向对象设计
- Effective C++ 3nd 读书摘要(六、继承与面向对象设计)Item32 - 40
- effective C++: 6.继承与面向对象设计
- Effective c++(笔记)之继承关系与面向对象设计
- 《Effective C++》第六章:继承与面向对象设计
- Effective C++ -- 继承与面向对象设计
- 今天一天的体会,虚函数 effective C++ 继承关系与面向对象设计读书笔记
- 【effective c++读书笔记】【第6章】继承与面向对象设计(1)
- NYOJ 题目58 最少步数 (简单BFS)
- C++的64位整数
- AndroidManifest.xml is missing
- jQuery AD Gallery相册插件
- 给新的PR类型分配审批权限
- Effective C++ 读书笔记(六) 继承与面向对象设计
- Linux USB驱动工作流程
- linux 数据类型长度总结
- AutoLisp函数
- VS“无法查找或打开PDB文件”的解决方法
- 2013上海大学排名
- Android远程服务举例(AIDL实现机制)
- Linux USB驱动相关细节知识
- JEECMS用法总结