作为类的设计者,有时希望派生类只继承成员函数的接口(声明);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现;有时则希望同时继承接口和实现,并且不允许派生类改写任何东西。
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)将所有的函数都声明为虚函数。有时这没错,例如协议类。但往往一些函数不能在派生类中重定义,只要是这种情况,我们就应该将它声明为非虚函数。
分享到:
相关推荐
电子教案-《自我管理》(第一单元第二课+认清自身角色)-4.pdf
做好规划认清自我让自己不再是SEO“流浪者”-文档资料.pdf做好规划认清自我让自己不再是SEO“流浪者”-文档资料.pdf做好规划认清自我让自己不再是SEO“流浪者”-文档资料.pdf做好规划认清自我让自己不再是SEO“流浪...
做好规划认清自我让自己不再是SEO“流浪者”-文档资料.ppt做好规划认清自我让自己不再是SEO“流浪者”-文档资料.ppt做好规划认清自我让自己不再是SEO“流浪者”-文档资料.ppt做好规划认清自我让自己不再是SEO“流浪...
九年级政治认清基本国情测试题-初中三年级政治试题练习、期中期末试卷-初中政治试卷.pdf
教育精品资料
上海市中考政治 认清基本国情复习教案-人教版初中九年级全册政治教案.doc
中考政治 九年级 第二单元 第三课 认清基本国情复习教案-人教版初中九年级全册政治教案.doc
2022长春继续教育认清历史使命,用于责任担当-简答题答案归纳.pdf
2.优化分类,调用到导航栏上面,实现改分类不用手动在修改! 3.内页调用代码一个显示不正常,进行了修复! 4.首页加入设为首页,加入收藏等代码功能! 5.特别提醒所有客户,网站上传后一定要修改data下在数据库名(改了...
实现打印货物标签和提货单的功能。(需要配合打印控件) 实现消息功能。 依赖 要求Python最低版本:v3.9+ 必要的第三方库 django mysqlclient openpyxl (用于实现报表导出功能) 可选的第三方库 django-debug-...
认清“增根”和“无解”.pdf认清“增根”和“无解”.pdf认清“增根”和“无解”.pdf认清“增根”和“无解”.pdf认清“增根”和“无解”.pdf
建筑钢结构工程技术-认清分包、转包、内包、挂靠.docx
在迎新典礼上的讲话-《认清现实,提高自我》.doc
九年级思想品德教案-第三课《认清基本国情》
顶级投行、金融估值建模培训资料-认清所处周期,把握动态变化.pdf
认清自己.exe
4.2.3 【实例】:用C实现简单的BASIC语言环境 165 4.3 C、C++的学习方式 187 4.3.1 从BASIC到C 187 4.3.2 C、汇编、API的关系 187 4.3.3 接口的建立方法 190 4.4 挂钩技术 201 4.4.1 Windows上C的挂钩 201 4.4.2 C++...
认清基本国情.ppt
里面包含了字节输入输出流、字符输入输出流的接口继承以及具体实现类的常用方法。使用了树形结构呈现出来,简单明了。 适用于:初学者:能更清晰地认清javaSE的IO流部分接口与实现类之间的关系。 其他人:要使用IO...