如何正确的使用继承和实现是本章说明的重点。

确定public继承的关系是is-a

  • public继承等同于is-a

  • 对public继承,所有base的特性,在derived上都适用

避免遮掩继承而来的名称

  • Deried中的函数会掩盖base中的函数,不论函数是成员函数、虚函数亦或是纯虚函数(不同作用域的函数,名称相同也不构成重载)

  • 使用 using base::f 的语法在Deried中强制使用base中被掩盖的函数

  • 一定要记清楚,Deried中使用base中的同名函数就违背is-a法则

区分接口实现和实现继承

  • non-virtual:指定接口继承和强制实现

  • virtual:指定接口继承和一个缺省实现版本

  • pure-virtual分两种情况:

    • 没有函实现:指定接口继承

    • 有函数实现:指定接口继承和一个缺省实现版本(加作用域调用)------ 和virtual相同

考虑virtual以外的实现

  • 虚函数的功能也可以被其他设计方法替代,从而避免虚函数的坑
  • 成员函数中调用虚函数是多态,调用虚函数时可以理解为this->f(),且此时没有public、protect和private的显示,因为是类内调用

    • non-virtual-interface

    • Dase中调用virtual函数,Deried中重写virtual函数,调用实际由Base确定,实现由Deried确认

  • Function Pointer

    • 函数指针作为类的成员变量,另外提供接口调用函数指针指向的函数

  • 使用模板函数对象代替函数指针

  • 将不同功能的函数设计在两个类中,实现成两种不同的继承体系

绝不重新定义继承而来的non-virtual函数

  • 注意继承中的名称遮掩(遮掩是对类外调用而言,不要和权限混淆,都当成public考虑)

绝不重新定义继承而来的缺省参数

  • 在不覆盖non-virtual函数的前提下,绝不重新定义继承而来的缺省参数只针对virtual而言

  • 函数参数的缺省值是静态绑定的,virtual是动态绑定的,所以不要重新定义参数的默认值

  • 可以使用NVI方式解决,no-virtual函数调用virtual函数,因为no-virtual函数绝对不能被掩盖,也就不会修改默认值

通过复合建模has-a或根据某物实现

  • A类中有B类的对象,叫has-a

  • 复合比继承扩张性更好

谨慎的使用private继承

  • private继承意味着has-a,和复合的概念相同

  • 能用复合就不用private,除非是特殊情况,Deried要继承Base中的protect成员

  • private继承可以节约内存

明智和谨慎的使用多重继承

  • 多重继承比较复杂,且容易导致二义性

  • virtual继承会增加复杂度等成本

  • 多重继承的使用场景:实现多个接口,继承一个基类

  • 建议:不使用多继承,使用单继承和实现多接口

高效C++:继承和实现的更多相关文章

  1. Web前端教程3-JavaScript教程

    目录 1. JavaScript介绍 1.1. JS嵌入页面的方式 2. JS基本语法 2.1. 变量类型 2.2. 获取元素方法 2.3. 操作元素属性 2.4. innerHTML的使用 3. J ...

  2. Effective Java (ENUM篇)

    我们存放一些静态变量,像是一些变量和设置,等等等等,我们尽量使用ENUM,因为ENUM是不可实例化和继承的,所以他很安全,它是在程序一开始运行的时候进行一些编译,修改ENUM不需要再次编译. 在什么时 ...

  3. 用于金融分析的Python包

    1. NumPy:实现各种数组对象函数和傅立叶变换等等科学计算模块.2. SciPy:提供更多科学计算功能,包括矩阵,求解线性方程组,积分运算,优化等.3. matplotlib:一个跨平台的数值绘图 ...

  4. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  5. js_继承

    一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 复制代码代码如下: <SPAN style="<SPAN style="FONT- ...

  6. tornado高效开发必备之源码详解

    前言:本博文重在tornado源码剖析,相信读者读完此文能够更加深入的了解tornado的运行机制,从而更加高效的使用tornado框架. 本文参考武sir博客地址:http://www.cnblog ...

  7. JSP模板继承功能实现

    背景 最近刚入职新公司,浏览一下新公司项目,发现项目中大多数JSP页面都是独立的.完整的页面,因此许多页面都会有如下重复的代码: <%@ page language="java&quo ...

  8. Android Drawable 那些不为人知的高效用法

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43752383,本文出自:[张鸿洋的博客] 1.概述 Drawable在我们平时的 ...

  9. jQuery 2.0.3 源码分析Sizzle引擎 - 高效查询

    为什么Sizzle很高效? 首先,从处理流程上理解,它总是先使用最高效的原生方法来做处理 HTML文档一共有这么四个API: getElementById 上下文只能是HTML文档 浏览器支持情况:I ...

随机推荐

  1. 韩顺刚-tcp报文头协议详细分析第一包数据:序号是0,发送数据的长度是0,因为没有收到对端的数据,所以确认号是0, Syn的标志位设置成1,这里没有发送的数据,只发送TCP的20个字节的头部

    TCP报文段首部格式 大部分TCP报文头部都是20个字节,有的数据包要加上选项. 上面一行代表4个字节,源端口和目的端口都是2个字节. TCP协议是面向字节流的协议 TCP是一段一段分块的发送数据的 ...

  2. 黎活明8天快速掌握android视频教程--23_网络通信之网络图片查看器

    1.首先新建立一个java web项目的工程.使用的是myeclipe开发软件 图片的下载路径是http://192.168.1.103:8080/lihuoming_23/3.png 当前手机和电脑 ...

  3. jvm入门及理解(六)——垃圾回收与算法

    一.jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二.如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1: ...

  4. 云服务器终端命令显示-bash-4.2#怎么解决

    原因:删除了root/.bashrc 和 root/.bash_profile两个文件的丢失 解决办法: -bash-4.2# cp /etc/skel/.bashrc /root/ -bash-4. ...

  5. Web安全之暴力破解

    暴力破解,顾名思义简单粗暴直接,我理解为将所有的“答案”都进行尝试直到找到正确的“答案", 当然我们不可能将所有的“答案”都进行尝试,所以我们只能将所有最有可能是正确的“答案”进行尝试即可 ...

  6. swift对象存储安装

    对象存储服务概览 OpenStack对象存储是一个多租户的对象存储系统,它支持大规模扩展,可以以低成本来管理大型的非结构化数据,通过RESTful HTTP 应用程序接口. 它包含下列组件: 代理服务 ...

  7. QUIC/HTTP3 协议简析

    从 HTTP 的进化历史讲起,细说使用协议的变迁,了解原因发现问题,解码 QUIC 在 HTTP3 中的支撑作用,共同探讨 HTTP3 的未来. HTTP.HTTP2 和 HTTP3 先和大家来回顾一 ...

  8. 这样基于Netty重构RPC框架你不可能知道

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365天原创计划”第5天. 今天呢!灯塔君跟大家讲: 基于Netty重构RPC框架 一.CyclicBarrier方法说明 1. ...

  9. Wooden Stricks——两个递增条件的线性DP

    题目 一堆n根木棍.每个棒的长度和重量是预先已知的.这些木棒将由木工机械一一加工.机器需要准备一些时间(称为准备时间)来准备处理木棍.设置时间与清洁操作以及更换机器中的工具和形状有关.木工机械的准备时 ...

  10. 转载--gulp入门

    关于gulp的入门文章,先转载了 http://markpop.github.io/2014/09/17/Gulp%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/