条款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++ 第六章相关推荐

  1. 王道考研 计算机网络笔记 第六章:应用层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

  2. JavaScript高级程序设计(第3版)第六章读书笔记

    第六章 面向对象的程序设计 1. 数据属性 [[Configurable]]:表示能否通过delete删除属性从而重新定义属性.默认值为true. [[Enumerable]]:表示能否通过for-i ...

  3. 数字图像处理——第六章 彩色图像处理

    数字图像处理--第六章 彩色图像处理 文章目录 数字图像处理--第六章 彩色图像处理 1 彩色模型 1.1 RGB彩色模型 1.2 CMY 和CMYK彩色模型 1.3 HSI彩色模型 2 伪彩色图像处 ...

  4. java三维滑雪,第六章 三维数据空间分析方法.ppt

    第六章 三维数据空间分析方法 * * * * 可视性分析 * * 自然邻域法插值 基本思路: 利用输入点及邻近栅格单元进行插值生成栅格表面. 方法: 利用输入数据点(样本点)为节点,建立Delauna ...

  5. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  6. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...

  7. 机器学习-第六章 支持向量机(SVM)

    机器学习-第六章 支持向量机(SVM) D系鼎溜关注 2020.02.09 21:19:41字数 1,131阅读 458 6.1 间隔与支持向量 开倍速观看视频之后,对课本所说的会更加了解. 支持向量 ...

  8. 第六章 非编码RNA鉴定

    第六章 非编码RNA鉴定  阅读量: 154 主要为RNA-seq相关知识,部分内容作笔记自查使用.如有错误或遗漏还请海涵,可评论或邮箱联系. 最后修改时间:2020-09-07 14:38:07 星 ...

  9. 谭浩强c语言第六章兔子数列,谭浩强 C语言 第6章_循环.ppt

    谭浩强 C语言 第6章_循环 第六章 本章要点 循环的基本概念 不同形式的循环控制 多重循环问题 主要内容 6.1 概述 6.2 goto语句以及用goto语句构成循环 6.3 用while语句实现循 ...

  10. 北电ERS1600,8300,8600交换机的基本技术-第六章 二层冗余技术(MLT,SMLT,IST)

    第六章 二层冗余技术(MLT,SMLT,IST) 这里只介绍北电独有的MLT ,SMLT 和IST.这些是二层的冗余协议: MLT:多链路中继,将多条链路模拟成一条链路 SMLT: 分离的多链路中继, ...

最新文章

  1. Pytorch笔记(python--类与对象(class and module))
  2. 笔记本移动位置,切换网络ip后,虚拟机的mac系统无法联网解决
  3. 小姐姐用动图展示 10 大 Git 命令,包你看完过目不忘!
  4. 以太坊和区块链实战技术分析详解
  5. python之环境变量(测试环境可配置)(亲测)
  6. 交换机配置——VTP管理交换机的VLAN配置
  7. 将自己写的windows服务加入到windows集群中
  8. Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用
  9. php5.0相等,关于php:3个相等
  10. golang map的无序性验证
  11. blender使用_使用Blender准备骨科手术
  12. android 统一错误处理,Android 程序错误处理全局处理
  13. arm linux gcc交叉编译,arm-linux-gcc交叉编译器安装
  14. 系统与服务器断开了连接不上,win7系统电脑玩跑跑卡丁车出现与服务器断开连接的解决方法...
  15. CSS3 实现图片上浮动画
  16. wps里面的流程图怎样更改_wps中流程图如何制作
  17. C#人民币金额大写转换
  18. (转)CTA大佬Winton创始人:人工智能会颠覆传统投资吗?
  19. 浅谈 GO 语言错误处理
  20. Android中字母大小写切换的快捷键

热门文章

  1. java从property中取值_Java中如何获取Properties文件中的内容2019-08-02
  2. 基于springboot的高校(学生)评教系统
  3. 右值引用、移动构造函数和move
  4. mysql备份文件无法回退_mysql备份灵活恢复
  5. 阿里面试官:HashMap 熟悉吧?好的,那就来聊聊 Redis 字典吧!
  6. podman,ctr镜像导入导出
  7. HTML DOM Image 对象
  8. 面向终端计算机网络的应用原理,山东科技大学计算机网络原理及应用复习提纲.doc...
  9. android 动态设置priority,Android属性之android:priority
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_5_综合案例_文件搜索...