public继承概念由两部分组成,函数接口(function interfaces)继承和函数实现(function implementations)继承。

作为类的开发人员,我们主要研究类的三种继承情况:
1、派生类只继承成员函数的接口(也就是声明);
2、派生类同时继承函数的接口和实现,但又希望能够覆写(override)它们所继承的实现;
3、派生类同时继承函数的接口和实现,并且不允许覆盖任何东西。

为了更好地理解上述情况,考虑以下例子:
eg:
class Shape{//形状
public:
  virtual void draw() const = 0;
  virtual void error(const std::string& msg);
  int objectID() const;
  ...
};

class Rectangle:public Shape{...};//矩形
class Ellipse:public Shape{...};//椭圆

Shape是个抽象类,它的纯虚函数draw使它成为一个抽象类,所以客户不能够创建Shape class的实体,只能创建它的派生类的实体。
Shape类声明了三个函数,第一个是draw,在视屏中划出当前对象,第二个是error,准备让那些“需要报导某个错误”的成员函数调用,第三个是objectID,返回当前对象的独一无二的整数识别码,每个函数的声明方式都不相同,draw是个纯虚函数(pure virtual),error是个虚函数( 简朴的(非纯)impure virtual函数),objectID是个非虚函数(non-virtual)函数。

纯虚函数通常有两个特点:它们必须被任何“继承了他们”的具象类重新声明;并且它们在抽象类中通常没有定义。
所以结论是:
1、声明一个纯虚函数的目的是为了让派生类只继承函数的接口。
这里需要指出的是,可以为纯虚函数提供定义,即可以为Shape:draw供应一份实现代码,但调用它的唯一方法是“调用时明确指出其类名称”(这种写法在实际开发中,并没有声明卵用):
Shape* ps = new shape;//错误,Shape是抽象的
Shape* ps1 = new Rectangle;//没问题
ps1->draw();//调用Rectangle::draw
Shape* ps2 = new Ellipse;//没问题
ps2->draw;//调用Ellipse::draw
ps1->Shape::draw();//调用Shape::draw
ps2->Shape::draw();//调用Shape::draw

虚函数(简朴的impure virtual函数)背后的故事和纯虚函数(pure virtual函数)有点不同,一如往常,派生类继承其函数接口,但虚函数(简朴的impure virtual函数)会提供一份实现代码,派生类可能覆写(override)它,所以结论是:
1、声明虚函数(简朴的impure virtual函数)的目的是让派生类继承该函数的接口和缺省实现,考虑error函数,其接口表示,每个类都必须支持一个“当遇上错误是可调用”的函数,但每个类可自由处理错误,若某个类不想针对错误做出任何特殊行为,它可以退回到Shape类提供的缺省错误处理行为。
但是允许虚函数(简朴的impure virtual函数)同时指定函数声明和函数缺省行为,却有可能造成危险。

注意:

1、接口继承和实现继承不同。在public继承之下,派生类总是继承基类的接口纯函数只是具体指定接口继承;
2、虚函数( 简朴的(非纯)impure virtual函数)具体指定接口继承及缺省实现继承;
3、非虚函数(non-virtual函数)具体指定接口继承以及强制性实现继承。

接口继承和实现继承的区别相关推荐

  1. C++ 接口继承与实现继承的区别和选择

    1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...

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

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

  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. java ReentrantLock 实现原理
  2. ML之LiR:利用LiR线性回归算法(自定义目标函数MSE和优化器GD)对Boston房价数据集(两特征+归一化)进行回归预测
  3. 网络怎么排错?手把手教你
  4. boost::hana::curry用法的测试程序
  5. 计算机会考补考时间安排,2019-2020学年第二学期初补考考试安排(实时更新)
  6. Android下xml中RelativeLayout布局常见属性
  7. 剑指offer-数值的整数次方
  8. webpack的学习
  9. Scala下载,安装及配置
  10. 服务器主机密码忘记了怎么破解?
  11. 把两个数和告诉A,积告诉B,A说不知道是多少, B也说不知道,这时A说我知道了, B接着说我也知道了,求这两个数是什么
  12. Microarchitecture: HyperThreading(超线程)
  13. 综合案例:实现注册、登录和跳转到主页面的功能。
  14. (十八)树莓派3B+ wiringPi库的使用--外部中断
  15. LeetCode报错:Line 1034:Char9
  16. Vue导出页面为pdf
  17. 大话设计模式系列目录
  18. RTC业务中的视频编解码引擎构建
  19. 横向联邦学习-梯度安全聚合(二)
  20. f分布表完整图a=0.01_建筑电气工程图的一般规定

热门文章

  1. 【信息系统项目管理师】论信息系统项目的整体管理(论文攻略篇)
  2. sword弹窗_刀剑神域夺命凶弹常见问题解决方法汇总_3DM单机
  3. css中实现显示和隐藏
  4. Iterator迭代器与foreach循环
  5. C# this关键字详解
  6. 数据可视化,我的数据分析成长之旅
  7. 最强最炫的Python数据可视化神器,没有之一!
  8. 【数字信号处理】Matlab做fft时点数N怎么选取
  9. Android12 AndroidManifest使用uses-library编译报错解决
  10. c 语言文件写入,c语言文件的读取和写入