《认清C++语言》---接口继承和实现继承
作为类的设计者,有时希望派生类只继承成员函数的接口(声明);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现;有时则希望同时继承接口和实现,并且不允许派生类改写任何东西。
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++语言》---接口继承和实现继承相关推荐
- 接口和抽象类是否继承了Object
我们先看一下Java的帮助文档对于Object的描述: Class Object is the root of the class hierarchy. Every class has Object ...
- java 类继承命名_Java 语言的类间的继承关系是( )。_学小易找答案
[判断题]对已经评定质量等级的旅游景区,每三年至少进行一次全面复核. [填空题]关键字 ______ 用于导入包中的类到程序中,供程序中使用. [填空题]创建类对象的运算符是 ________ . [ ...
- C++中的接口继承和实现继承
C++中的接口继承和实现继承 很多人认为,C++中是不存在接口继承的,只有Java.C#这类语言才提供了相应的语法支持. 但是,如同鲁迅说过的某句名言:世上本没有接口继承,用的人多了,才有了接口继承. ...
- Go语言中的代码重用 - 继承还是组合?
故事要从我在一个项目中,想要假装的专业一点而遇到的一个陷阱说起. 代码重用 在这个项目中,我们已经有了类似如下的代码: package main import ( "fmt&qu ...
- java声明像素的继承_15、Java语言的类间的继承关系是
[判断题]中心原子中的几个原子轨道杂化时,必形成数目相同的杂化轨道. [填空题]3.在JAVA语言中,每个英文字符占 个字节,每个中文汉字占( )个字节. [填空题]在Java语言中,使用______ ...
- java接口的继承是多继承吗
Java接口 不仅可以继承接口,还可以多继承.接口是常量值和方法定义的集合.接口是一种特殊的抽象类.在java中不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定 ...
- 25接口之间的单继承
Demo01Relations.java package Relations; /* * 1.类与类之间是单继承的.直接父类只有一个. * 2.类与接口是多实现的.一个类可以实现多个接口. * 3.接 ...
- java父类转子类_java中什么是继承,和继承的接口的关系?
继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...
- [EffectiveC++]item34:区分接口继承和实现继承
[EffectiveC++]item34:区分接口继承和实现继承 转载于:https://www.cnblogs.com/jeanschen/p/3363569.html
- java接口构建英雄属性_Python接口类的多继承以及抽象类的单继承
一.接口类(面向对象开发的思想和规范)的多继承 需求: 定义一个tiger类:会走,会游 定义一个hawk类:会走,会飞 定义一个swan类:会走,会游,会飞 (a)如果像以下代码的方式,则不能够满足 ...
最新文章
- SpringBoot培训教程--史前文明之Spring简介
- 三代测序原理与数据文件简介(SMRT+Nanopore)
- warning:partition X does not end on cylinder boundary
- ARM体系结构及内核回顾总结(一)
- 解密初、中、高级程序员的进化之路
- python最全知识点_史上最全的Python面向对象知识点疏理
- 利用SqlBulkCopy插入数据
- 找CTO杜仲:技术人别把股权(期权)弄成一张废纸(新书推荐)
- cpython知乎_Numpy为什么可以用C语言写?
- [51nod1232]完美数
- oracle分析函数sum() over()
- MCCSframework 教程(四)表单
- 从wireshark 抓包中的导出 H.264 变成可用暴风直接播放的H264 裸码流文件
- Matlab用saveas函数自动编号保存图片
- 如何用计算机的if,if函数的使用方法(if函数的使用方法)
- 做最好的自己(李开复)
- 五款超级易用的网络监控软件
- 科恒khs202温控器使用说明书_WS203数字显示温控器使用说明书
- UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
- 誓成运动科技第一股:为何Keep忘初心
热门文章
- 【转】如何读一篇论文
- mysql5.7 单机多实例_MySQL数据库 5.7.21单机多实例安装
- 【我的相册】北方的传统面艺
- 开个坑: gitk和git容易被滥用的 cherry-pick 功能
- [摘抄] 资深软件项目经理/产品经理“扯皮技巧”汇总(新手入坑必读,不定期更新)...
- GDAL插值使用示例
- SpringBoot集成Swagger2自动生成友好的RestApi测试页面及文档
- 记一次golang中sync.Map并发创建、读取的问题
- 走在网页游戏开发的路上——页游资源管理
- oracle中dual最多存多大_ORACLE中dual用法详解