文件名:<1> shape.h ;<2> circle.h ;<3> circle.cpp ;<4> rectangular.h ;<5> rectangular.cpp ;<6> main.cpp

1、多态

是面向对象程序设计的关键技术。

调用同一个函数名,可以根据需要实现不同的功能。

编译时的多态性(函数重载);运行时的多态性(虚函数)。

2、纯虚函数

在函数基类中声明,在派生类中实现。

virtual关键字;声明时须在后面加上 =0;派生类中实现时无须写virtual。

3、抽象类

含有纯虚函数的类。

在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向引用的子类对象

注:

可以把析构函数定义为虚函数,但不能将构造函数定义为虚函数。

因为定义为虚函数的构造函数只是声明了而没有实现,没有初始化,不能被继承。

每个类都要有自己的构造函数,对自己进行初始化。

<1> shape.h

  1 //文件名 shape.h2 3 #ifndef SHAPE_H //防止重复包含的宏开关4 #define SHAPE_H5 6 #include <string>7 8 /* virtual在基类中声明纯虚函数,其实现在派生类中  */9 class i_Shape10 {11 public:12         virtual float getArea() = 0;    //纯虚函数的声明:virtual关键字,声明之后写上 =013         virtual std::string getName() = 0;14 15 };16 17 #endif

<2> circle.h

  1 //文件名 circle.h2 3 #ifndef CIRCLE_H4 #define CIRCLE_H5 6 #include "shape.h"7 8 class c_Circle : public i_Shape //继承i_Shape类
9 {10 public:11         c_Circle(float radius); //含参数的构造函数12 public:13         virtual float getArea();        //抽象类的虚函数。此处需要关键字virtual,但不需要在后面加上 =014         virtual std::string getName();15 private:16         float m_Radius;17 };18 19 #endif

<3> circlr.cpp

  1 //文件名 circle.cpp2 3 #include "circle.h"4 5 c_Circle::c_Circle(float radius)        //含参数的虚构函数6         :m_Radius(radius)       //初始化列表7 {8 9 }10 11 float c_Circle::getArea()       //虚函数的实现。此处无须关键字virtual12 {13         return 3.14 * m_Radius * m_Radius;14 }15 16 std::string c_Circle::getName()         //虚函数的实现。此处无须关键字virtual17 {18         return "circle 圆形的";19 }

<4> rectangular.h

  1 //文件名 rectangualr.h2 3 #ifndef RECTANGULAR_H   //防止重复包含的宏开关4 #define RECTANGULAR_H5 6 #include "shape.h"7 8 class c_Rect : public i_Shape   //继承 i_Shape接口 interface9 {10 public:11         c_Rect();       //不含参数的默认构造函数12         ~c_Rect();      //析构函数13         c_Rect(float width,float length);       //含参数的构造函数14 public:15         virtual float getArea();        //virtual虚函数。。此处无须写 =016         virtual std::string getName();17 private:18         float m_Width;  //private成员19         float m_Length;20 21 };22 23 #endif

<5> rectangular.cpp

  1 //文件名 rectangular.cpp2 3 #include "rectangular.h"4 5 c_Rect::c_Rect()        //不含参数的默认构造函数6 {7 8 }9 10 c_Rect::~c_Rect()       //析构函数11 {12 13 }14 15 c_Rect::c_Rect(float width,float length)        //含参数的构造函数16         :m_Width(width),m_Length(length)        //初始化列表:以冒号开头,以逗号分隔17 {18 19 }20 21 float c_Rect::getArea() //虚函数的实现22 {23         return m_Width * m_Length;24 }25 26 std::string c_Rect::getName()   //虚函数的实现27 {28         return "Rectangular 方形的";29 }

<6> main.cpp

  1 //文件名 main.cpp2 //3 #include "rectangular.h"4 #include "circle.h"5 6 #include <iostream>7 8 int main()9 {10         /* 定义抽象类对象i_Shape的指针p,并指向引用的子类对象c_Circle  */11         i_Shape* p = new c_Circle(10);12         std::cout<< p -> getName() << "  " << p -> getArea() <<std::endl;13         delete p;14 15         /* 定义抽象类对象i_Shape的指针p,并指向引用的子类对象c_Ret  */16         p = new c_Rect(10,20);17         std::cout<< p -> getName() << "  " << p -> getArea() <<std::endl;18 19         return 0;20 }

编译、链接、执行

c++入门(多态and纯虚函数and抽象类)相关推荐

  1. <C++>多态之纯虚函数与抽象类,学习不一样的析构函数

    在自己的世界里独善其身,在别人的世界顺其自然 ✨写在前面         书接上文,  今天继续学习多态的内容.上文提到了虚函数,那么今天就来讲讲什么是纯虚函数,抽象类和纯虚函数关联紧密,所以也学习一 ...

  2. 9-2:C++多态之纯虚函数和抽象类以及接口继承和实现继承

    文章目录 (1)纯虚函数和抽象类的概念 (2)抽象类的意义 (3)接口继承与实现继承 (1)纯虚函数和抽象类的概念 如果一个类的虚函数后面写上=0,同时不写它的实现,那么这样的虚函数称之为纯虚函数,包 ...

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

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

  4. C++ 多态之纯虚函数和抽象类01

    纯虚函数的语法, virtual void func() = 0; 如果类中有了纯虚函数, 那么这个类也成为抽象类 抽象类无法实例化对象 继承了抽象类的子类,必须要重写父类中的纯虚函数,否则的话,子类 ...

  5. c++远征之多态篇——纯虚函数和抽象类、接口类

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.纯虚函数 没有函数体: =0: 即只有函数声明,而没有函数定义的虚函数,是纯虚函数. 2.抽象类 概念:含有纯虚函数的类,叫抽象类. 抽象类无 ...

  6. C++_类和对象_C++多态_纯虚函数和抽象类---C++语言工作笔记072

    然后我们再来看一下c++中的抽象类,以及纯虚函数是什么意思. 可以看到如果类中有纯虚函数,那么这个类,就可以称为抽象类. 抽象类,是无法实例化,跟java一样,子类继承抽象类,必须要重写抽象类中的方法 ...

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

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

  8. C++学习12:C++多态、虚函数、虚析构函数、纯虚函数、抽象类

    一 多态概述 C++中的多态分为静态多态和动态多态.静态多态是函数重载,在编译阶段就能确定调用哪个函数.动态多态是由继承产生的,指同一个属性或行为在基类及其各派生类中具有不同的语义,不同的对象根据所接 ...

  9. C++基本概念复习之二:多重继承、虚继承、纯虚函数(抽象类)

    一.多重继承: #include <iostream> using namespace std; class Horse { public: Horse(){cout<<&qu ...

最新文章

  1. IntelliJ IDEA for Mac 在MacOS模式的重构快捷键(Refactoring Shortcut)
  2. python中变量和函数的区别_python中带下划线的变量和函数的意义
  3. eclipse 中警告信息汇总
  4. “迭代期内无变更”与敏捷开发产品版本规划
  5. vue使用slot分发内容与react使用prop分发内容
  6. [swift] LeetCode 21. Merge Two Sorted Lists
  7. jQuery之animate自定义动画
  8. POJ-2034 Anti-prime Sequences dfs
  9. 程序员之路:python3+PyQt5+pycharm桌面GUI开发
  10. 7-8-无向图的关节点-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
  11. 个税系统服务器怎么设置,如何开通个税服务器地址
  12. 领导力教练:世界著名企业教练们的实践心得(原书第3版)
  13. 删除Windows 7系统保留分区100MB
  14. 深空摄影系列教程(昴星团摄星队)笔记
  15. Logitech G系鼠标脚本编程,实现鼠标自动定位控制
  16. 开源项目之:SharpDevelop
  17. 大学计算机基础专升本复习提纲
  18. 桌面增加了IE图标无法删除
  19. Tableau实用小技巧之——红绿色字体颜色设置
  20. Linux查主板槽位使用情况,linux下查看主板内存槽与内存信息

热门文章

  1. 真服了!docker源码分析孙宏亮
  2. linux进阶25——tcpdump详解
  3. php+redis 盲盒字符兑换道具
  4. Python机器学习与实践——简介篇
  5. python读取raw图片文件_【IT专家】使用Python读取CR2(原始佳能图像)头。
  6. 99元极路由(Hiwifi)入手手记
  7. java poker_poker21 21点 Java 可实现基本功能,包括计算双方点数,显示输赢,计分 Games 游戏 247万源代码下载- www.pudn.com...
  8. qfile超过下载文件容量_如何下载视频网站上的视频,这里有方法
  9. 20部经典电影的人生哲理
  10. 【HTML——炫酷粒子】(效果+代码)