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++ 接口继承与实现继承的区别和选择相关推荐

  1. 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类

    文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...

  2. 接口继承和实现继承的区别

    public继承概念由两部分组成,函数接口(function interfaces)继承和函数实现(function implementations)继承. 作为类的开发人员,我们主要研究类的三种继承 ...

  3. java父类转子类_java中什么是继承,和继承的接口的关系?

    继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...

  4. java中什么是继承,和继承的接口的关系?

    继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...

  5. 【Java】继承 Thread 和 实现 Runnable 区别

    继承 Thread VS 实现 Runnable 区别 从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档可以看到Thread类本身就实现 ...

  6. 25接口之间的单继承

    Demo01Relations.java package Relations; /* * 1.类与类之间是单继承的.直接父类只有一个. * 2.类与接口是多实现的.一个类可以实现多个接口. * 3.接 ...

  7. [EffectiveC++]item34:区分接口继承和实现继承

    [EffectiveC++]item34:区分接口继承和实现继承 转载于:https://www.cnblogs.com/jeanschen/p/3363569.html

  8. java接口构建英雄属性_Python接口类的多继承以及抽象类的单继承

    一.接口类(面向对象开发的思想和规范)的多继承 需求: 定义一个tiger类:会走,会游 定义一个hawk类:会走,会飞 定义一个swan类:会走,会游,会飞 (a)如果像以下代码的方式,则不能够满足 ...

  9. 接口和抽象类是否继承了Object

    我们先看一下Java的帮助文档对于Object的描述: Class Object is the root of the class hierarchy. Every class has Object ...

最新文章

  1. Linux实战案例(5)关闭Centos的防火墙
  2. Git常用命令总结(超实用)
  3. jquery+html 压缩图片
  4. php 网站速度慢,php – 个人用户网站速度慢,但他们可以切换浏览器?
  5. 一看就懂的感知机算法PLA
  6. LRU原理及其实现(C++)
  7. Kaggle 房价预测竞赛优胜方案:用 Python 进行全面数据探索
  8. 第五章 高级发布-订阅模式
  9. 分享几款常用的MySQL管理工具
  10. java jdk官网下载地址
  11. 找出若干个非零数中的最小值以及它们的平均值
  12. 《玩转股票量化交易》知识星球2021年度回顾
  13. ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
  14. 微信支付服务器请求错误,windows系统下微信支付调用出错 msxml3.dll
  15. iOS 13获取keyWindow
  16. 平价蓝牙耳机里面性价比高推荐?隐形蓝牙耳机超小推荐
  17. js表格隔行变色案例
  18. 如何将VSCode添加到鼠标右键菜单
  19. 鸿蒙系统 规划,华为发布鸿蒙系统,青岛华为基地规划布局
  20. linux密码配置文件详解,用户配置文件与密码配置文件

热门文章

  1. 从“No space left on device”到删除海量文件
  2. python def和lambda的应用
  3. 上网行为审计产品对比(2008版)
  4. Ubuntu 13.10 用sogou拼音替换ibus-转
  5. matlab波形反白,基于MATLAB的海岸污染物浓度扩散实验分析
  6. Linux开放端口、关闭防火墙操作
  7. [Python] L1-031. 到底是不是太胖了-PAT团体程序设计天梯赛GPLT
  8. CCCC-GPLT L1-037. A除以B 团体程序设计天梯赛
  9. 蓝桥杯 ALGO-73 算法训练 统计字符次数
  10. 蓝桥杯 ADV-205 算法提高 拿糖果 java版