effective c++ 第六章
条款32:确定你的public继承塑模出is-a关系
确认子类和父类的关系是正确的
class Person {...};class Student: public Person {...};
以下有问题
class Bird {public:virtual void fly(); // birds can fly...};class Penguin:public Bird { // penguins are birds...};
属于设计问题,以上可以把fly声明为虚方法,然后在Penguin报error都可以
条款33:避免遮掩继承而来的名称
下列代码出现遮掩问题
class Base { private:int x; public:virtual void mf1() = 0;virtual void mf1(int);virtual void mf2();void mf3();void mf3(double);...};class Derived: public Base {public:virtual void mf1();void mf3();void mf4();...};
使用示例
Derived d;int x;... d.mf1(); // fine, calls Derived::mf1 d.mf1(x); // error! Derived::mf1 hides Base::mf1 d.mf2(); // fine, calls Base::mf2 d.mf3(); // fine, calls Derived::mf3 d.mf3(x); // error! Derived::mf3 hides Base::mf3
要想在子类使用父类被遮掩的方法可以用using关键字,以下使得上面的代码正常运行
class Derived: public Base { public:using Base::mf1; // make all things in Base named mf1 and mf3using Base::mf3; // visible (and public) in Derived's scopevirtual void mf1();void mf3();void mf4();... };
使用private隐藏基类函数,只允许在子类调用
class Derived: private Base {public:virtual void mf1() // forwarding function; implicitly{ Base::mf1(); } // inline (see Item30)... }; ... Derived d; int x; d.mf1(); // fine, calls Derived::mf1 d.mf1(x); // error! Base::mf1() is hidden
条款34:区分接口继承和实现继承
class Shape {public:virtual void draw() const = 0;virtual void error(const std::string& msg);int objectID() const;...};
抽象方法必须实现即接口继承,具备抽象方法的类(抽象类)无法直接实例化 (虚方法)实现方法子类可以选择不实现
条款35:考虑virtual函数以外的其他选择
1.模板模式,重写部分函数
class GameCharacter { public:int healthValue() const // derived classes do not redefine{ // this — see Item 36... // do "before" stuff — see belowint retVal = doHealthValue(); // do the real work... // do "after" stuff — see belowreturn retVal;}... private:virtual int doHealthValue() const // derived classes may redefine this{... // default algorithm for calculating} // character's health };
2.策略模式
class GameLevel {public:float health(const GameCharacter&) const; // health calculation... // mem function; note}; // non-int return typeclass EvilBadGuy: public GameCharacter { // as before...};class EyeCandyCharacter: public GameCharacter { // another character... // type; assume same}; // constructor as
条款36:绝不重新定义继承而来的non-virtual函数
同条款33,必须去这么做
class B { public:void mf();...};class D: public B { public:void mf();... };
条款37:绝不重新定义继承而来的缺省参数值
以下子类重写的缺省参数值将会无效(静态绑定,为了运行效率)
// a class for geometric shapes class Shape { public:enum ShapeColor { Red, Green, Blue };// all shapes must offer a function to draw themselvesvirtual void draw(ShapeColor color = Red) const = 0;...};class Rectangle: public Shape { public:// notice the different default parameter value — bad!virtual void draw(ShapeColor color = Green) const;... };
条款38:通过复合塑模出has-a或”根据某物实现出”
不通过继承的方式,而是通过复合和适配的方式,实现功能,避免继承父类的耦合度,优先采用此方案
class Address { ... }; // where someone livesclass PhoneNumber { ... };class Person { public:... private:std::string name; // composed objectAddress address; // dittoPhoneNumber voiceNumber; // dittoPhoneNumber faxNumber; // ditto};
用list实现Set
template<class T> // the right way to use list for Set class Set { public:bool member(const T& item) const;void insert(const T& item);void remove(const T& item);std::size_t size() const; private:std::list<T> rep; // representation for Set data };
条款39:明智而审慎地使用private继承
private继承意味着implemented-in-terms-of(根据某物实现出)。用意是为了采用基类已经备妥的某些特性
条款40:明智而审慎地使用多重继承
1.函数重名调用
class BorrowableItem { // something a library lets you borrowpublic:void checkOut(); // check the item out from the library...};class ElectronicGadget {private:bool checkOut() const; // perform self-test, return whether... // test succeeds};class MP3Player: // note MI herepublic BorrowableItem, // (some libraries loan MP3 players)public ElectronicGadget{ ... }; // class definition is unimportantMP3Player mp;mp.checkOut(); //wrong ambiguous! which checkOut? mp.BorrowableItem::checkOut(); // ah, that checkOut...
转载于:https://www.cnblogs.com/Clingingboy/archive/2011/08/07/2130237.html
effective c++ 第六章相关推荐
- 王道考研 计算机网络笔记 第六章:应用层
本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...
- JavaScript高级程序设计(第3版)第六章读书笔记
第六章 面向对象的程序设计 1. 数据属性 [[Configurable]]:表示能否通过delete删除属性从而重新定义属性.默认值为true. [[Enumerable]]:表示能否通过for-i ...
- 数字图像处理——第六章 彩色图像处理
数字图像处理--第六章 彩色图像处理 文章目录 数字图像处理--第六章 彩色图像处理 1 彩色模型 1.1 RGB彩色模型 1.2 CMY 和CMYK彩色模型 1.3 HSI彩色模型 2 伪彩色图像处 ...
- java三维滑雪,第六章 三维数据空间分析方法.ppt
第六章 三维数据空间分析方法 * * * * 可视性分析 * * 自然邻域法插值 基本思路: 利用输入点及邻近栅格单元进行插值生成栅格表面. 方法: 利用输入数据点(样本点)为节点,建立Delauna ...
- Knockout应用开发指南 第六章:加载或保存JSON数据
原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...
- ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...
- 机器学习-第六章 支持向量机(SVM)
机器学习-第六章 支持向量机(SVM) D系鼎溜关注 2020.02.09 21:19:41字数 1,131阅读 458 6.1 间隔与支持向量 开倍速观看视频之后,对课本所说的会更加了解. 支持向量 ...
- 第六章 非编码RNA鉴定
第六章 非编码RNA鉴定 阅读量: 154 主要为RNA-seq相关知识,部分内容作笔记自查使用.如有错误或遗漏还请海涵,可评论或邮箱联系. 最后修改时间:2020-09-07 14:38:07 星 ...
- 谭浩强c语言第六章兔子数列,谭浩强 C语言 第6章_循环.ppt
谭浩强 C语言 第6章_循环 第六章 本章要点 循环的基本概念 不同形式的循环控制 多重循环问题 主要内容 6.1 概述 6.2 goto语句以及用goto语句构成循环 6.3 用while语句实现循 ...
- 北电ERS1600,8300,8600交换机的基本技术-第六章 二层冗余技术(MLT,SMLT,IST)
第六章 二层冗余技术(MLT,SMLT,IST) 这里只介绍北电独有的MLT ,SMLT 和IST.这些是二层的冗余协议: MLT:多链路中继,将多条链路模拟成一条链路 SMLT: 分离的多链路中继, ...
最新文章
- Pytorch笔记(python--类与对象(class and module))
- 笔记本移动位置,切换网络ip后,虚拟机的mac系统无法联网解决
- 小姐姐用动图展示 10 大 Git 命令,包你看完过目不忘!
- 以太坊和区块链实战技术分析详解
- python之环境变量(测试环境可配置)(亲测)
- 交换机配置——VTP管理交换机的VLAN配置
- 将自己写的windows服务加入到windows集群中
- Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用
- php5.0相等,关于php:3个相等
- golang map的无序性验证
- blender使用_使用Blender准备骨科手术
- android 统一错误处理,Android 程序错误处理全局处理
- arm linux gcc交叉编译,arm-linux-gcc交叉编译器安装
- 系统与服务器断开了连接不上,win7系统电脑玩跑跑卡丁车出现与服务器断开连接的解决方法...
- CSS3 实现图片上浮动画
- wps里面的流程图怎样更改_wps中流程图如何制作
- C#人民币金额大写转换
- (转)CTA大佬Winton创始人:人工智能会颠覆传统投资吗?
- 浅谈 GO 语言错误处理
- Android中字母大小写切换的快捷键
热门文章
- java从property中取值_Java中如何获取Properties文件中的内容2019-08-02
- 基于springboot的高校(学生)评教系统
- 右值引用、移动构造函数和move
- mysql备份文件无法回退_mysql备份灵活恢复
- 阿里面试官:HashMap 熟悉吧?好的,那就来聊聊 Redis 字典吧!
- podman,ctr镜像导入导出
- HTML DOM Image 对象
- 面向终端计算机网络的应用原理,山东科技大学计算机网络原理及应用复习提纲.doc...
- android 动态设置priority,Android属性之android:priority
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_5_综合案例_文件搜索...