| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> Effective C++ 总结笔记(五) -> 正文阅读 |
|
[C++知识库]Effective C++ 总结笔记(五) |
六、继承与面向对象设计32.确定你的public继承塑模出is-a关系public继承意味着is-a。适用于base class身上的每一件事情也一定适用于derived class身上。每一个derived class对象也都是一个base class对象。 33.避免遮掩继承而来的名称编译器对于各作用域有查找顺序,内层作用域的名称会遮掩外围作用域的名称,所以会造成名称遮掩,各作用域依次为: global作用域 namespace base class derived class local作用域 等等 1.派生类内的名称会遮掩基类内的名称。 2.可以利用using声明式或者inline转交函数使遮掩函数重见天日 34.区分接口继承和实现继承1. pure virtual函数使derived class只具体指定接口继承,并且必须被任何继承了它的具象class重新声明。我们也可以为pure virtual函数提供定义,但调用它的唯一途径是指出其class名称。 2. impure virtual函数使derived class继承函数接口以及更平常更安全的缺省实现。 我们可以为impure virtual函数提供定义,派生类可以选择继承函数接口或者一份缺省实现。 3.non-virtual函数使derived class继承函数的接口和一份强制性实现 35.考虑virtual函数以外的其他选择1.Non-Virtual Interface手法实现Template Method模式:令客户通过public non-virtual成员函数间接调用private virtual函数,得以在一个virtual函数被调用之前设定好场景,并在调用结束之后清理场景。 2.藉由Function Pointers实现Strategy模式:可以由构造函数接受一个指针,指向一个提供该功能的函数,例如:
3.藉由tr1::function完成Strategy模式:改用一个类型为tr1::function的对象,这样的对象可以保存任何可调用物(callable entity,即函数指针、函数对象、成员函数指针),只要其签名式兼容于需求端,上面的typedef语句修改为: typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc; 接受一个reference指向const GameCharacter,并返回int。 4.古典的Strategy模式:将继承体系内的virtual函数替换为另一个继承体系内的virtual函数,如下:
只要为HealthCalcFunc继承体系添加一个derived class就行了。 36.绝不重新定义继承而来的non-virtual函数non-virtual函数是静态绑定的,virtual函数是动态绑定的 37.绝不重新定义继承而来的缺省参数值原因:virtual函数是动态绑定的,但缺省参数值却是静态绑定,可能会在调用一个定义于derived class内的virtual函数时,使用base class指定的缺省参数值。 使用NVI手法(令public non-virtual函数调用private virtual函数)可以防止缺省参数值被重新定义 注: 为了运行期效率,c++坚持缺省参数值为静态绑定,防止运行期复杂的决定 38.通过复合塑模出has-a或根据某物实现出
39.明智而审慎地使用private继承Private继承的规则:如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象。 1.Private继承意味implemented-in-terms-of(只有实现被继承,接口部分应略去) 2.尽可能使用复合,必要时才使用private继承(当derived class想访问base class的protected成分时,或为了重新定义virtual函数时,还有造成EBO(empty base optimization)节省内存时才为必要) *40*.明智而审慎的使用多重继承1.多重继承可能从多个base class继承相同名称,可能导致“菱形继承”(base class被多次构造,可以使用virtual继承解决) 2.使用virtual继承导致对象体积大,访问成员变量速度慢等问题;因此,非必要不要使用virtual bases,如果要使用,尽可能避免在其中放置数据(相当于对virtual继承) 3.多重继承的一个正当用途是“复合+继承”技术,单一继承更受欢迎 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 8:46:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |