Effective C++ 笔记:条款 34 实现继承和接口继承
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 实现继承和接口继承的更多相关文章
- C#类继承和接口继承时一些模棱两可的问题[转]
原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html 1.在father定义的方法若含有virtual关键字,chi ...
- php中类继承和接口继承的对比
PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &q ...
- PHP类继承、接口继承关系概述
PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &quo ...
- Python学习第十八课——继承,接口继承等
1.继承:字面意思 # 继承 : 字面意思 class father: pass class grandfather: pass class children(father): # 单继承 pass ...
- [Effective JavaScript 笔记]第34条:在原型中存储方法
js中完全有可能不借助原型进行编程.不用在其原型中定义任何的方法. 创建对象 构造函数法 所有属性和方法都在构造函数中定义 function User(name,pwd){ this.name=nam ...
- 潭州课堂25班:Ph201805201 第十一课 继承,多继承和魔术方法,属性和方法 (课堂笔记)
继承: class p : cls_name = 'p' def __init__(self): print('正在实例化') def __del__(self): print('正在销毁') cla ...
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- JS继承之原型继承
许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...
随机推荐
- pod 更新慢解决方案
pod install --verbose --no-repo-update pod update --verbose --no-repo-update
- python中TCP协议中的粘包问题
TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...
- Mysql出现(10061)错误提示的暴力解决办法
上个月我还在说别人的怎么老是会错呢,我的就没事,嘿 今天就轮到我了 我发誓 我绝对没碰它 是它先动的手 言归正传 下面给你们 介绍 终极大招 为什么是终极大招呢 因为网上那些前辈们的方法我都试 ...
- css 动态线条制作方案
利用 :before or :after 在元素中添加线条样式: 设置样式的过渡效果属性值: 改变width,left,transform等属性值,设置鼠标移入:hover 效果: li: ...
- 您可能不知道的CSS元素隐藏“失效”以其妙用
您可能不知道的CSS元素隐藏“失效”以其妙用 by zhangxinxu from http://www.zhangxinxu.com地址:http://www.zhangxinxu.com/word ...
- 【JAVA】String[]配列の相関
配列の作成: ①String[] str = new String[5]; ②String[] str = new String[]{"","","& ...
- Add `gem 'sqlite3'` to your Gemfile
错误:Specified 'sqlite3' for database adapter, but the gem is not loaded. Add `gem 'sqlite3'` to your ...
- 盒子模型(Box Model)
盒子模型(Box Model) ■ 盒子模型——概念 在网页设计中常用的属性名:内容(content),填充(padding),边框(border),边界(margin),CSS 盒子模式都具备这些属 ...
- pwnable.kr-flag-witeup
嗯,看到提示,需要逆向哦. 欧克,运行flag,看到打印了一句话I will malloc() and strcpy the flag there. take it. IDA看看程序逻辑,shift+ ...
- TZOJ 2289 Help Bob(状压DP)
描述 Bob loves Pizza but is always out of money. One day he reads in the newspapers that his favorite ...