高效C++:继承和实现
如何正确的使用继承和实现是本章说明的重点。
确定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++:继承和实现的更多相关文章
- Web前端教程3-JavaScript教程
目录 1. JavaScript介绍 1.1. JS嵌入页面的方式 2. JS基本语法 2.1. 变量类型 2.2. 获取元素方法 2.3. 操作元素属性 2.4. innerHTML的使用 3. J ...
- Effective Java (ENUM篇)
我们存放一些静态变量,像是一些变量和设置,等等等等,我们尽量使用ENUM,因为ENUM是不可实例化和继承的,所以他很安全,它是在程序一开始运行的时候进行一些编译,修改ENUM不需要再次编译. 在什么时 ...
- 用于金融分析的Python包
1. NumPy:实现各种数组对象函数和傅立叶变换等等科学计算模块.2. SciPy:提供更多科学计算功能,包括矩阵,求解线性方程组,积分运算,优化等.3. matplotlib:一个跨平台的数值绘图 ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- js_继承
一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 复制代码代码如下: <SPAN style="<SPAN style="FONT- ...
- tornado高效开发必备之源码详解
前言:本博文重在tornado源码剖析,相信读者读完此文能够更加深入的了解tornado的运行机制,从而更加高效的使用tornado框架. 本文参考武sir博客地址:http://www.cnblog ...
- JSP模板继承功能实现
背景 最近刚入职新公司,浏览一下新公司项目,发现项目中大多数JSP页面都是独立的.完整的页面,因此许多页面都会有如下重复的代码: <%@ page language="java&quo ...
- Android Drawable 那些不为人知的高效用法
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43752383,本文出自:[张鸿洋的博客] 1.概述 Drawable在我们平时的 ...
- jQuery 2.0.3 源码分析Sizzle引擎 - 高效查询
为什么Sizzle很高效? 首先,从处理流程上理解,它总是先使用最高效的原生方法来做处理 HTML文档一共有这么四个API: getElementById 上下文只能是HTML文档 浏览器支持情况:I ...
随机推荐
- Mac上使用brew另装ruby和gem的新玩法
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 众所周知,Mac ...
- android handle详解2 主线程给子线程发送消息
按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能 ...
- java中“”==“” equals hashcode的关系
ava中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比 ...
- Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端
要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...
- SQL中的ON DUPLICATE KEY UPDATE使用详解
一:主键索引,唯一索引和普通索引的关系主键索引 主键索引是唯一索引的特殊类型. 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行.该列称为表的主键. 在数据库关系图中为表定义一个主键将自动创建 ...
- SpringBoot启动源码及自定义starter
为什么springboot工程能够在mian方法中完成启动呢?需要大家掌握的有几个点:1.SPISPI在springboot中是去读取META-INF/spring.factories目录的配置文件内 ...
- flask的小错误
这几天刚学flask,根据录屏学代码的时候,遇到一个问题 基本能看懂错误,role_id是类的一个字段,应该是一个对象,最后发现是单词写错了,应该是大写的Column, db.Column(db.In ...
- 小程序拾色器(颜色选择器)组件mini-color-picker
特性: 现有方案分析 we-color-picker 需注意组件定位,操作不跟手不流畅,配置复杂.其定位会撑开原有页面,体验不佳.滑动距离按像素区分(固定),需考虑设备分辨率,不利于多端. Papae ...
- 机器学习入门:极度舒适的GBDT原理拆解
机器学习入门:极度舒适的GBDT拆解 本文旨用小例子+可视化的方式拆解GBDT原理中的每个步骤,使大家可以彻底理解GBDT Boosting→Gradient Boosting Boosting是集成 ...
- H5软键盘弹起收回(IOS与Android)
IOS下中,软键盘处于窗口最顶层,与原有的窗口不冲突,所以底部导航条不会被顶起,但是在android下,软键盘与窗口处于同一层,所以当软键盘弹起时,当前窗口缩小,那么窗口内容自然要被挤: 解决办法: ...