c++入门(多态and纯虚函数and抽象类)
文件名:<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抽象类)相关推荐
- <C++>多态之纯虚函数与抽象类,学习不一样的析构函数
在自己的世界里独善其身,在别人的世界顺其自然 ✨写在前面 书接上文, 今天继续学习多态的内容.上文提到了虚函数,那么今天就来讲讲什么是纯虚函数,抽象类和纯虚函数关联紧密,所以也学习一 ...
- 9-2:C++多态之纯虚函数和抽象类以及接口继承和实现继承
文章目录 (1)纯虚函数和抽象类的概念 (2)抽象类的意义 (3)接口继承与实现继承 (1)纯虚函数和抽象类的概念 如果一个类的虚函数后面写上=0,同时不写它的实现,那么这样的虚函数称之为纯虚函数,包 ...
- C++多态(二)——纯虚函数、抽象类
本篇涉及内容: 纯虚函数 抽象类 纯虚函数: 1)应用场景: 在多态中,通常父类中的虚函数是无意义的,一般情况下都会被子类重写,此时可以将父类中的这些虚函数改为纯虚函数. 2)纯虚函数语法:virtu ...
- C++ 多态之纯虚函数和抽象类01
纯虚函数的语法, virtual void func() = 0; 如果类中有了纯虚函数, 那么这个类也成为抽象类 抽象类无法实例化对象 继承了抽象类的子类,必须要重写父类中的纯虚函数,否则的话,子类 ...
- c++远征之多态篇——纯虚函数和抽象类、接口类
以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.纯虚函数 没有函数体: =0: 即只有函数声明,而没有函数定义的虚函数,是纯虚函数. 2.抽象类 概念:含有纯虚函数的类,叫抽象类. 抽象类无 ...
- C++_类和对象_C++多态_纯虚函数和抽象类---C++语言工作笔记072
然后我们再来看一下c++中的抽象类,以及纯虚函数是什么意思. 可以看到如果类中有纯虚函数,那么这个类,就可以称为抽象类. 抽象类,是无法实例化,跟java一样,子类继承抽象类,必须要重写抽象类中的方法 ...
- c/c++入门教程 - 2.4.7 多态、函数地址晚绑定(重写,虚函数,纯虚函数,抽象类,虚析构,纯虚析构)
目录 4.7 多态 4.7.1 多态的基本概念(超级重要) 4.7.2 多态的原理刨析(超级重要) 4.7.2 多态案例一:计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 ...
- C++学习12:C++多态、虚函数、虚析构函数、纯虚函数、抽象类
一 多态概述 C++中的多态分为静态多态和动态多态.静态多态是函数重载,在编译阶段就能确定调用哪个函数.动态多态是由继承产生的,指同一个属性或行为在基类及其各派生类中具有不同的语义,不同的对象根据所接 ...
- C++基本概念复习之二:多重继承、虚继承、纯虚函数(抽象类)
一.多重继承: #include <iostream> using namespace std; class Horse { public: Horse(){cout<<&qu ...
最新文章
- IntelliJ IDEA for Mac 在MacOS模式的重构快捷键(Refactoring Shortcut)
- python中变量和函数的区别_python中带下划线的变量和函数的意义
- eclipse 中警告信息汇总
- “迭代期内无变更”与敏捷开发产品版本规划
- vue使用slot分发内容与react使用prop分发内容
- [swift] LeetCode 21. Merge Two Sorted Lists
- jQuery之animate自定义动画
- POJ-2034 Anti-prime Sequences dfs
- 程序员之路:python3+PyQt5+pycharm桌面GUI开发
- 7-8-无向图的关节点-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
- 个税系统服务器怎么设置,如何开通个税服务器地址
- 领导力教练:世界著名企业教练们的实践心得(原书第3版)
- 删除Windows 7系统保留分区100MB
- 深空摄影系列教程(昴星团摄星队)笔记
- Logitech G系鼠标脚本编程,实现鼠标自动定位控制
- 开源项目之:SharpDevelop
- 大学计算机基础专升本复习提纲
- 桌面增加了IE图标无法删除
- Tableau实用小技巧之——红绿色字体颜色设置
- Linux查主板槽位使用情况,linux下查看主板内存槽与内存信息
热门文章
- 真服了!docker源码分析孙宏亮
- linux进阶25——tcpdump详解
- php+redis 盲盒字符兑换道具
- Python机器学习与实践——简介篇
- python读取raw图片文件_【IT专家】使用Python读取CR2(原始佳能图像)头。
- 99元极路由(Hiwifi)入手手记
- java poker_poker21 21点 Java 可实现基本功能,包括计算双方点数,显示输赢,计分 Games 游戏 247万源代码下载- www.pudn.com...
- qfile超过下载文件容量_如何下载视频网站上的视频,这里有方法
- 20部经典电影的人生哲理
- 【HTML——炫酷粒子】(效果+代码)