在介绍抽象类之前,我们先介绍一下纯虚函数。

1.纯虚函数

  在基类中仅仅给出声明,不对虚函数实现定义,而是在派生类中实现。这个虚函数称为纯虚函数。普通函数如果仅仅给出它的声明而没有实现它的函数体,这是编译不过的。纯虚函数没有函数体。

  纯虚函数需要在声明之后加个=0;

class <基类名>

{

virtual <类型><函数名>(<参数表>)=0; ......

};

2.抽象类

  含有纯虚函数的类被称为抽象类。抽象类只能作为派生类的基类,不能定义对象,但可以定义指针。在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向或引用子类对象。

1)在定义纯虚函数时,不能定义虚函数的实现部分;

2)在没有重新定义这种纯虚函数之前,是不能调用这种函数的。

  抽象类的唯一用途是为派生类提供基类,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。继承于抽象类的派生类如果不能实现基类中所有的纯虚函数,那么这个派生类也就成了抽象类。因为它继承了基类的抽象函数,只要含有纯虚函数的类就是抽象类。纯虚函数已经在抽象类中定义了这个方法的声明,其它类中只能按照这个接口去实现。

3.接口和抽象类的区别

1)C++中我们一般说的接口,表示对外提供的方法,提供给外部调用。是沟通外部跟内部的桥梁。也是以类的形式提供的,但一般该类只具有成员函数,不具有数据成员;

2)抽象类可以既包含数据成员又包含方法。

抽象类的实例

1.抽象类IShape作为基类:只有头文件,没有实现文件

#ifndef SHAPE_H#define SHAPE_H#includeusing std::string;//interfaceclass IShape{public:virtual float getArea()=0; //纯虚函数,获得面积virtual string getName()=0; //纯虚函数,返回图形的名称};#endif

2.派生类Circle类继承自抽象类IShape:

Circle.h头文件:

#ifndef CIRCLE_H#define CIRCLE_H#include"Shape.h"class CCircle : public IShape //公有继承自IShape类{public:CCircle(float radius); //构造函数public:virtual float getArea(); //实现声明实现两个基类的函数,声明的时候需要加virtual关键字,实现的时候就不需要加virtual关键字了。virtual string getName();private:float m_fRadius; //派生类可以拥有自己的成员};#endif

Circle.cpp实现文件:

#include"Circle.h"CCircle::CCircle(float radius):m_fRadius(radius) //使用构造函数的初始化列表初始化{}float CCircle::getArea() / /实现实现两个基类的函数virtual string getName();{return 3.14 * m_fRadius * m_fRadius;}string CCircle::getName(){return "CCircle";}

3. 派生类Rect类继承自抽象类IShape:

Rect.h头文件:

#ifndef RECT_H#define RECT_H#include"shape.h"class CRect : public IShape{public:CRect(float nWidth, float nHeight);public:virtual float getArea();virtual string getName();private:float m_fWidth; //矩形类具有自己的两个属性,宽和高float m_fHeight;};

Rect.cpp实现文件:

#include"Rect.h"CRect::CRect(float fWidth, float fHeight):m_fWidth(fWidth), m_fHeight(fHeight){}float CRect::getArea(){return m_fWidth * m_fHeight;}string CRect::getName(){return "CRect";}

4.测试文件main.cpp:

#include#include"Rect.h"#include"Circle.h"using namespace std;int main(){IShape* pShape = NULL; //定义了一个抽象类的指针,注意抽象类不能定义对象但是可以定义指针pShape = new CCircle(20.2); //基类指针指向派生类的对象cout<getName()<<" "<getArea()<<endl;delete pShape; //释放了CCirle对象所占的内存,但是指针是没有消失的,它现在就是一个野指针,我们在使用之前必须对它赋值pShape = new CRect(20, 10); //基类指针指向派生类的对象cout<getName()<<" "<getArea()<<endl;return 0;}

  运行结果如下:可以看到,我们使用父类的指针调用同一个函数,分别调用了这两个派生类的对应函数,它根据指针指向的类型的不同来决定调用的方法。即使我们以后需要新增加几个类,我们还是这种调用方法,这就是多态的巨大魅力。

原文链接:https://blog.csdn.net/lidiya007/article/details/53220786

C++抽象类详解--纯虚函数,抽象类相关推荐

  1. C++ 虚函数 纯虚函数 抽象类 代码示例

    其中抽象类指的是在类的定义中出现了纯虚函数,导致无法实例化,. 代码:头文件 #include "stdafx.h"using namespace std;class Person ...

  2. 抽象类的继承/纯虚函数的实现

    纯虚函数是指类似 virtual void Do()=0 的函数,含有纯虚函数的类是抽象类,不能实例化对象,其子类需实现所有纯虚函数方能实例化对象. 以上面向对象的规则读者应该都比较清楚,但有个问题大 ...

  3. c++ 纯虚函数和抽象类那些事(一)

    1.纯虚函数与抽象类 C++中的纯虚函数(或抽象函数)是我们没有实现的虚函数!我们只需声明它!通过声明中赋值0来声明纯虚函数! 纯虚函数:没有函数体的虚函数 抽象类:包含纯虚函数的类 /*** @br ...

  4. C++中的抽象类及纯虚函数的实现与否

    1.含有纯虚函数的叫抽象类 2.抽象类(一般是基类)中的纯虚函数无论函数体实现与否,都没有关系,系统会自动忽略 3.继承自抽象类的子类,必须要实现父类的纯虚函数才可以实例化对象 4.抽象类不允许实例化 ...

  5. 【C++grammar】访问控制与抽象类与纯虚函数

    目录 一.访问控制 (可见性控制) 1.private.public.protected关键字 2.关键字示例 1.关键字对类数据成员访问的限制 3. 公有继承 4. 私有继承 5. 保护继承 6. ...

  6. c++多态--2(计算器,纯虚函数和抽象类)

    为什么要用多态 早期方法不利于扩展 开闭原则 开闭原则 对扩展开放 对修改关闭 利用多态实现-利于后期扩展,结构性非常好,可读性高,效率稍微低,发生多态内部结构复杂 多态成立的条件 又继承 子类重写父 ...

  7. C++纯虚函数与抽象类

    纯虚函数 1.1纯虚函数是在声明虚函数时被"初始化"为0的函数.声明纯虚函数的一般形式为: virtual 函数类型 函数名 (参数列表) =0; 如 virtual float ...

  8. c/c++入门教程 - 2.4.7 多态、函数地址晚绑定(重写,虚函数,纯虚函数,抽象类,虚析构,纯虚析构)

    目录 4.7 多态 4.7.1 多态的基本概念(超级重要) 4.7.2 多态的原理刨析(超级重要) 4.7.2 多态案例一:计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 ...

  9. C++多态(二)——纯虚函数、抽象类

    本篇涉及内容: 纯虚函数 抽象类 纯虚函数: 1)应用场景: 在多态中,通常父类中的虚函数是无意义的,一般情况下都会被子类重写,此时可以将父类中的这些虚函数改为纯虚函数. 2)纯虚函数语法:virtu ...

最新文章

  1. SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
  2. Android4: HDMI system in ICS
  3. 双色球随机选号器界面设计及功能实现
  4. 【每周CV论文推荐】换脸算法都有哪些经典的思路?
  5. RStudio-Desktop与RStudio-Server的启动方式
  6. 临时手机验证码_实用网站(一)短信验证码 临时网盘 临时邮箱
  7. android 联系人批量插入,GitHub - Atinerlengs/InsertDemo: android 简单的批量插入通话记录、联系人、短信demo...
  8. 苹果经典复古彩虹Logo回归?这效果图 看了只想告辞!
  9. 从源代码编译安装 Mono 2.4 和 MonoDevelop 2.0
  10. 关于我对区块链和比特币的看法
  11. centos7网络配置总结
  12. eclipse优化设置
  13. Linux使用Firefox播放视频
  14. 搜索巨头百度深耕中国量子产业
  15. 程序员必备:那些实用的Chrome扩展程序
  16. 小蒟蒻的blog美化汇总~
  17. 接口做的好怎么形容_游戏耳机怎么选?入耳式游戏耳机测评+游戏音频指南
  18. mysql建库图解_数据库 MySQL安装图解
  19. 未能联接game center服务器,game center连接不成功怎么办 有哪些修复步骤 - 驱动管家...
  20. Java分割PDF文件(itextpdf)

热门文章

  1. 不会还有人不了解OSI 七层模型与TCP 四层模型吧???
  2. 档案馆智能查询系统,让档案查询更精准
  3. 联想小新Pro14外接显示器无法显示
  4. 微信小程序在模拟器可以显示,手机扫编译二维码显示不了 解决办法
  5. 小白新手装机-----全
  6. ITF跆拳道考试内容
  7. 将heic格式批量转化jpg或png
  8. pc端使用高德地图api获取当前位置的经纬度
  9. android 代码 自动锁定时间,Android系统取消自动锁定屏幕
  10. Open3D安装及测试