C++ 接口继承与实现继承的区别和选择
1.接口继承与实现继承的区别
《Effective C++》条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点:
(1)纯虚函数只提供接口继承,但可以被实现;
(2)虚函数既提供接口继承,也提供了一份默认实现,即也提供实现继承;
(3)普通函数既提供接口继承,也提供实现继承。
这里假定讨论的成员函数都是public的。
这里回顾一下这三类函数,如下:
class BaseClass {public:void virtual PureVirtualFunction() = 0; // 纯虚函数void virtual ImpureVirtualFunction(); // 虚函数void CommonFunciton(); // 普通函数};
纯虚函数有一个"=0"的声明,具体实现一般放在派生类中(但基类也可以有具体实现),所在的类(称之为虚基类)是不能定义对象的,派生类中仍然也可以不实现这个纯虚函数,交由派生类的派生类实现,总之直到有一个派生类将之实现,才可以由这个派生类定义出它的对象。
虚函数必须有实现,否则会报链接错误。虚函数可以在基类和多个派生类中提供不同的版本,利用多态性质,在程序运行时动态决定执行哪一个版本的虚函数(机制是编译器生成的虚表)。virtual关键字在基类中必须显式指明,在派生类中不必指明,即使不写,也会被编译器认可为virtual函数,virtual函数存在的类可以定义实例对象。
普通函数则是将接口与实现都继承下来了,如果在派生类中重定义普通函数,将同名函数隐藏。事实上,也是极不推荐在派生类中隐藏基类的普通函数,如果真的要这样做,请一定要考虑是否该把基类的这个函数声明为虚函数或者纯虚函数。
下面看一个示例程序。CShape 是一个几何图形的基类,对于任何一个几何图形来说,绘制和设置颜色都是合理的操作,因此可以按照如下方式设计类:
class CShape {public:virtual void draw()=0;virtual void setColor(const Color& color);
private:Color _color;
};class CCircle:public CShape{};
class CEllipse:public CShape{};
上面几个类的申明就可以很好地展示继承的两个相互独立的部分:函数接口继承(inheritance of function interfaces)和函数实现继承(inheritance of function implementations)。
在基类 CShape 中,不能够为每一种不同的图形提供一个默认的 draw 实现,所以设置为纯虚函数,留给派生类来实现,也就说派生类只是继承了一个借口而已。圆和椭圆有着自己的绘制方式,所以各自有独自的绘制实现。
对于 CShape::setColor,将其设置为普通的虚函数,提供一个默认的实现,这样圆和椭圆既可以重新定义,也可以使用基类的默认实现。使用普通的虚函数,派生类既使用了接口继承,也使用了实现继承。
2.接口继承与实现继承的选择
类设计时,接口继承与实现继承相互独立,代表着一定的设计意义,在二者之间进行选择时,我们需要考虑一个因素:对于无法提供默认版本的函数接口选择函数接口继承,对于能够提供默认版本的函数接口,选择函数实现继承。
参考文献
[1] 读书笔记_Effective_C++_条款三十四:区分接口继承和实现继承
[2] 李健.编写高质量代码:改善C++程序的150个建议[M].第一版.北京:机械工业出版社,2012.1:314-315
C++ 接口继承与实现继承的区别和选择相关推荐
- 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类
文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...
- 接口继承和实现继承的区别
public继承概念由两部分组成,函数接口(function interfaces)继承和函数实现(function implementations)继承. 作为类的开发人员,我们主要研究类的三种继承 ...
- java父类转子类_java中什么是继承,和继承的接口的关系?
继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...
- java中什么是继承,和继承的接口的关系?
继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...
- 【Java】继承 Thread 和 实现 Runnable 区别
继承 Thread VS 实现 Runnable 区别 从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档可以看到Thread类本身就实现 ...
- 25接口之间的单继承
Demo01Relations.java package Relations; /* * 1.类与类之间是单继承的.直接父类只有一个. * 2.类与接口是多实现的.一个类可以实现多个接口. * 3.接 ...
- [EffectiveC++]item34:区分接口继承和实现继承
[EffectiveC++]item34:区分接口继承和实现继承 转载于:https://www.cnblogs.com/jeanschen/p/3363569.html
- java接口构建英雄属性_Python接口类的多继承以及抽象类的单继承
一.接口类(面向对象开发的思想和规范)的多继承 需求: 定义一个tiger类:会走,会游 定义一个hawk类:会走,会飞 定义一个swan类:会走,会游,会飞 (a)如果像以下代码的方式,则不能够满足 ...
- 接口和抽象类是否继承了Object
我们先看一下Java的帮助文档对于Object的描述: Class Object is the root of the class hierarchy. Every class has Object ...
最新文章
- Linux实战案例(5)关闭Centos的防火墙
- Git常用命令总结(超实用)
- jquery+html 压缩图片
- php 网站速度慢,php – 个人用户网站速度慢,但他们可以切换浏览器?
- 一看就懂的感知机算法PLA
- LRU原理及其实现(C++)
- Kaggle 房价预测竞赛优胜方案:用 Python 进行全面数据探索
- 第五章 高级发布-订阅模式
- 分享几款常用的MySQL管理工具
- java jdk官网下载地址
- 找出若干个非零数中的最小值以及它们的平均值
- 《玩转股票量化交易》知识星球2021年度回顾
- ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
- 微信支付服务器请求错误,windows系统下微信支付调用出错 msxml3.dll
- iOS 13获取keyWindow
- 平价蓝牙耳机里面性价比高推荐?隐形蓝牙耳机超小推荐
- js表格隔行变色案例
- 如何将VSCode添加到鼠标右键菜单
- 鸿蒙系统 规划,华为发布鸿蒙系统,青岛华为基地规划布局
- linux密码配置文件详解,用户配置文件与密码配置文件
热门文章
- 从“No space left on device”到删除海量文件
- python def和lambda的应用
- 上网行为审计产品对比(2008版)
- Ubuntu 13.10 用sogou拼音替换ibus-转
- matlab波形反白,基于MATLAB的海岸污染物浓度扩散实验分析
- Linux开放端口、关闭防火墙操作
- [Python] L1-031. 到底是不是太胖了-PAT团体程序设计天梯赛GPLT
- CCCC-GPLT L1-037. A除以B 团体程序设计天梯赛
- 蓝桥杯 ALGO-73 算法训练 统计字符次数
- 蓝桥杯 ADV-205 算法提高 拿糖果 java版