Differentiate between inheritance of interface and inheritance of implementation.


行为含义

声明一个pure virtual函数得目的是为了让derived classes只继承函数接口。

(你必须提供一个接口,但我不干涉你如何实现它)

class Shape {
virtual void draw() = 0;
};
...
Shape *ps1 = new Rectangle;
ps1->Shape::draw(); // ??

声明简朴的(非纯)impure virtual函数的目的,是让derived classes继承该函数的接口和缺省实现。

class Airplane {
public:
virtual void fly(const Airport &destination) { }
}; class ModelA : public Airplane {};
class ModelB : public Airplane {};
class ModelC : public Airplane {}; // Forgets to rewrite fly()

这将造成巨大的灾难,普通的impure virtual函数肩负两职将带来对其忘记重写的后果。

解决方案:

class Airplane {
public:
virtual void fly(const Airport &destination) = 0;
protected:
void defaultFlay(const Airport &destination) { }
}; class ModelA : public Airplane {
public:
virtual void fly(const Airport &destination) {
defaultFly(destination);
}
};

将一个impure virtual函数的职能分配到一个protected函数与一个纯虚函数上。

声明non-virtual函数的目的,是让derived classes继承该函数的接口和一份强制性实现。

non-virtual函数表现的是不变性(invariant)和凌驾特异性(specialization) 他绝不应该在派生类中被重写。

重提80-20原则

20%的代码在80%的时间中运行。也就是说剩余的80%的代码可以是virtual函数,而你应当先把注意力集中在20%的代码上。

Effective C++ 笔记:条款 34 实现继承和接口继承的更多相关文章

  1. C#类继承和接口继承时一些模棱两可的问题[转]

    原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html 1.在father定义的方法若含有virtual关键字,chi ...

  2. php中类继承和接口继承的对比

    PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &q ...

  3. PHP类继承、接口继承关系概述

    PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &quo ...

  4. Python学习第十八课——继承,接口继承等

    1.继承:字面意思 # 继承 : 字面意思 class father: pass class grandfather: pass class children(father): # 单继承 pass ...

  5. [Effective JavaScript 笔记]第34条:在原型中存储方法

    js中完全有可能不借助原型进行编程.不用在其原型中定义任何的方法. 创建对象 构造函数法 所有属性和方法都在构造函数中定义 function User(name,pwd){ this.name=nam ...

  6. 潭州课堂25班:Ph201805201 第十一课 继承,多继承和魔术方法,属性和方法 (课堂笔记)

    继承: class p : cls_name = 'p' def __init__(self): print('正在实例化') def __del__(self): print('正在销毁') cla ...

  7. JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承

    相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...

  8. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  9. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

随机推荐

  1. Maven项目强制更新,解决Failed to read artifact descriptor for xxx.jar问题

    导入的maven项目pom.xml现红叉 分析原因:在maven本地仓库中找不到相应的jar包. 解决方案:让maven强制更新依赖. 项目右击菜单,Maven -> Update Projec ...

  2. Spring 获取bean 几种方式

    转载自: http://www.cnblogs.com/luoluoshidafu/p/5659574.html 1.读取xml文件的方式,这种在初学入门的时候比较适用 . ApplicationCo ...

  3. Error:java: Compilation failed: internal java compiler error 解决办法

    https://blog.csdn.net/jdjdndhj/article/details/70256989

  4. 输入一段字符串,统计其中的数字,字母,空格,其他字符的方法 ----python---

    1.以简单的循环分支实现字符统计 str1 = input("输入字符串:") num=0;word=0;space=0;other=0; for i in str1: if i. ...

  5. iview table中使用Poptip

    h('Poptip', { props: { confirm: true, // 'ok-text':"yes", // 'cancel-text':"no", ...

  6. java 下载网络文件

    1.FileUtils.copyURLToFile实现: import java.io.File; import java.net.URL; import org.apache.commons.io. ...

  7. win7系统标准用户恢复administrator账号方法

    一次误操作,把管理员账号给禁用了,满眼的泪花~~~~~~~~~ 标准用户,什么都干不了,怎么办呢????? 度娘一下,各种奇葩答案,就是解决不了 呵呵,最后找到了解决方法: 1.开机后BIOS过后,按 ...

  8. Git命令面试集

    获取与创建项目命令 git init              在目录中创建新的Git仓库(需要切换到目录下) git clone          拷贝一个Git仓库到本地 基本快照 git add ...

  9. 2018-2019-2 《Java程序设计》结对项目阶段总结《四则运算——整数》(二)

    20175218 2018-2019-2 <Java程序设计>结对项目阶段总结<四则运算--整数> 一.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加,减, ...

  10. 18. 4Sum (JAVA)

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...