作为类的设计者,有时希望派生类只继承成员函数的接口(声明);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现;有时则希望同时继承接口和实现,并且不允许派生类改写任何东西。

class ASCEShape

{

public:

virtual void draw() const = 0;     //纯虚函数,因此ASCEShape成为一个抽象类

virtual void error(const string& msg);         //一般虚函数

int objectID() const;      //非虚函数

...

};

class ASCERectangle : public ASCEShape {...};

class ASCEEllipse : public ASCEShape {...};

纯虚函数最显著的特征是:它们必须在继承了它们的任何具体类中重新声明,而且它们在抽象类中往往没有定义。因此:定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。

为一个纯虚函数提供定义也是可能的,我们可以为ASCEShape::draw提供实现,C++编译器不会报错,但调用它的唯一方式是通过类名完整的指明是哪个调用:

//假设在ASCEShape中定义了纯虚函数draw

ASCEShape *ps = new ASCEShape;     //错误,ASCEShape是抽象类

ASCEShape *ps1 = new ASCERectangle;    //正确

ps1->draw();          //调用ASCERectangle::draw

ASCEShape *ps2 = new ASCEEllipse; //正确

ps2->draw();                   //调用ASCEEllipse::draw

ps1->ASCEShape::draw();    //调用ASCEShape::draw

ps2->ASCEShape::draw();   //调用ASCEShape::draw

(纯虚函数必须在子类中重新声明,但它还是可以在基类中有自己的实现)

有时,声明一个除了纯虚函数之外什么也不包含的类是很有用的,这样的类叫做协议类。它为派生类仅提供函数接口,完全没有实现。

声明一般虚函数的目的在于:使派生类继承函数的接口和缺省实现。

声明非虚函数的目的在于:使派生类继承函数的接口和强制性实现。注意,非虚函数表示一种特殊性上的不变性,所以决不能在子类中重新定义。

理解了纯虚函数。简单虚函数和非虚函数在声明上的区别,我们就可以精确地指定想让派生类继承什么:仅仅是接口,还是接口和一个缺省实现,或者是接口和一个强制实现。

常见的错误:

1)把所有的函数都声明为非虚函数。这就使得派生类没有特殊化的余地。事实上是:几乎任何一个作为基类使用的类都有虚函数。

2)将所有的函数都声明为虚函数。有时这没错,例如协议类。但往往一些函数不能在派生类中重定义,只要是这种情况,我们就应该将它声明为非虚函数。

转载于:https://www.cnblogs.com/android-html5/archive/2010/06/24/2534027.html

《认清C++语言》---接口继承和实现继承相关推荐

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

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

  2. java 类继承命名_Java 语言的类间的继承关系是( )。_学小易找答案

    [判断题]对已经评定质量等级的旅游景区,每三年至少进行一次全面复核. [填空题]关键字 ______ 用于导入包中的类到程序中,供程序中使用. [填空题]创建类对象的运算符是 ________ . [ ...

  3. C++中的接口继承和实现继承

    C++中的接口继承和实现继承 很多人认为,C++中是不存在接口继承的,只有Java.C#这类语言才提供了相应的语法支持. 但是,如同鲁迅说过的某句名言:世上本没有接口继承,用的人多了,才有了接口继承. ...

  4. Go语言中的代码重用 - 继承还是组合?

    故事要从我在一个项目中,想要假装的专业一点而遇到的一个陷阱说起. 代码重用 在这个项目中,我们已经有了类似如下的代码: package main   import (     "fmt&qu ...

  5. java声明像素的继承_15、Java语言的类间的继承关系是

    [判断题]中心原子中的几个原子轨道杂化时,必形成数目相同的杂化轨道. [填空题]3.在JAVA语言中,每个英文字符占 个字节,每个中文汉字占( )个字节. [填空题]在Java语言中,使用______ ...

  6. java接口的继承是多继承吗

    Java接口 不仅可以继承接口,还可以多继承.接口是常量值和方法定义的集合.接口是一种特殊的抽象类.在java中不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定 ...

  7. 25接口之间的单继承

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

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

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

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

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

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

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

最新文章

  1. SpringBoot培训教程--史前文明之Spring简介
  2. 三代测序原理与数据文件简介(SMRT+Nanopore)
  3. warning:partition X does not end on cylinder boundary
  4. ARM体系结构及内核回顾总结(一)
  5. 解密初、中、高级程序员的进化之路
  6. python最全知识点_史上最全的Python面向对象知识点疏理
  7. 利用SqlBulkCopy插入数据
  8. 找CTO杜仲:技术人别把股权(期权)弄成一张废纸(新书推荐)
  9. cpython知乎_Numpy为什么可以用C语言写?
  10. [51nod1232]完美数
  11. oracle分析函数sum() over()
  12. MCCSframework 教程(四)表单
  13. 从wireshark 抓包中的导出 H.264 变成可用暴风直接播放的H264 裸码流文件
  14. Matlab用saveas函数自动编号保存图片
  15. 如何用计算机的if,if函数的使用方法(if函数的使用方法)
  16. 做最好的自己(李开复)
  17. 五款超级易用的网络监控软件
  18. 科恒khs202温控器使用说明书_WS203数字显示温控器使用说明书
  19. UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
  20. 誓成运动科技第一股:为何Keep忘初心

热门文章

  1. 【转】如何读一篇论文
  2. mysql5.7 单机多实例_MySQL数据库 5.7.21单机多实例安装
  3. 【我的相册】北方的传统面艺
  4. 开个坑: gitk和git容易被滥用的 cherry-pick 功能
  5. [摘抄] 资深软件项目经理/产品经理“扯皮技巧”汇总(新手入坑必读,不定期更新)...
  6. GDAL插值使用示例
  7. SpringBoot集成Swagger2自动生成友好的RestApi测试页面及文档
  8. 记一次golang中sync.Map并发创建、读取的问题
  9. 走在网页游戏开发的路上——页游资源管理
  10. oracle中dual最多存多大_ORACLE中dual用法详解