C++:纯虚函数及抽象类

1.纯虚函数

在虚函数的声明后加“=0” ,表示当前虚函数无需定义

eg:

class Shape //图形类
{
public:virtual double circum()const = 0;//周长,纯虚函数virtual double area()const = 0;  //面积,纯虚函数virtual void show()const;        //输出,虚函数
};

2.抽象类

抽象类为一个类族提供公共接口(父类引用、指针),便于发挥动态多态的特性。

注意:

  1. 抽象类只能作为基类无法创建对象
  2. 抽象类可以提供类的指针、引用,便于实现动态多态
  3. 只要类中含有纯虚函数,该类则为抽象类
  4. 抽象类的派生类中若依然存在纯虚函数,则其派生类依然为抽象类,抽象类直至类中没有纯虚函数为止,才能创建对象。

结合代码示例:


//纯虚函数、抽象类
#include <iostream>
#include <string>
#include<math.h>
using namespace std; //需要的操作:1.构造; 2.析构; 3.周长; 4.面积; 5.输出相应的数据
//1.用普通的类结构实现上面五种图形
//2.利用继承和多态实现上面五种图形
//3.把上面两种方式进行对比class Shape //抽象类
{
public:virtual double round()const =0{}virtual double area()const =0{}virtual ~Shape(){}
};class San :public Shape //三角形
{
public:int a, b, c;San(int a1,int b1,int c1):a(a1),b(b1),c(c1){}virtual double round()const  {cout << "三角形三边为" <<a<<","<<b<<","<<c<< endl;return a + b + c;}virtual double area()const {if (a + b > c || a + c > b || c + b > a){double s = (a + b + c) / 2;return sqrt(s * (s - a) * (s - b) * (s - c)); }}
};
class Chang :public Shape //长方形
{
public:int a, b;Chang(int a1,int a2):a(a1),b(a2){}virtual double round()const{cout << "长方形的两条边为:" << a << "," << b << endl;return 2 * (a + b);}virtual double area()const {return a * b;}
};
class Zheng :public Shape //正方形
{
public:int len;Zheng(int l) :len(l) {}virtual double round()const {cout << "正方形的边长为:" << len << endl;return 4 * len;}virtual double area()const {return len * len;}
};
class Circle :public Shape //圆形
{
public:int r;Circle(int r1):r(r1){}virtual double round()const {cout << "圆形的半径为:" << r << endl;return 3.14 * 2 * r;}virtual double area()const{return 3.14 * r * r;}
};
class Ping :public Shape //平行四边形
{
public:int a;//底边(长边)int b;//高int c;//短边Ping(int a1,int b1,int c1):a(a1),b(b1),c(c1){}virtual double round()const {cout << "平行四边形的长边、短边、高为:" << a << "," << c << "," << b << endl;return 2 * (a + c);}virtual double area()const {return a * b;}
};void show(Shape& a)
{cout<<"  周长为:" << a.round() << endl;;cout << "  面积为:" << a.area() << endl;;
}int main()
{San s1(3, 4, 5);show(s1);Chang s2(4, 5);show(s2);Ping s3(5, 3, 4);show(s3);Zheng s4(5);show(s4);Circle s5(10);show(s5);return 0;
}

        代码由抽象类Shape作为基类,派生出各个图形类,由虚函数的继承特性使得所有派生类的周长、面积计算函数均属于虚函数,最后调用类外show() 函数以抽象类 Shape 作为对象接口,实现同太多太输出不同对象的参数,相比无继承、无虚函数、无动态多态的代码设计而言,提高了代码的复用率,减少了冗余的代码,使程序简单便捷。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505334.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL窗口函数, 测试题

第一题 create table user_score (logday date, -- 考试时间 userid VARCHAR(20), -- 考试用户 score int); -- 考试成绩Insert into user_score values (2019-10-20,11111,85) ,(2019-10-20,22222,83) ,(2019-10-20,33333,86) ,(2019-10-21,11111,87) ,(2019-10-2…

贪心 Leetcode 376 摆动序列

摆动序列 Leetcode 376 学习记录自代码随想录 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#…

【数据结构】知识点一:线性表之顺序表

内容导航 一、什么是线性表&#xff1f;二、什么是顺序表&#xff1f;1、顺序表的概念2、顺序表的结构a. 静态顺序表&#xff1a;使用定长数组存储元素。b. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、顺序表的接口实现精讲1.接口一&#xff1a;打印数据2.接口二&…

算法 -【最小路径和】

最小路径和 题目示例1示例2 分析代码 题目 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例1 输入&#xff1a;grid [[1,3,1],[1,5,1…

Ethernet/IP转Modbus TCP网关

产品功能 1 YC-EIP-TCP工业级EtherNet/IP 网关 2 Modbus TCP 转 EtherNet/IP 3支持ModBus主从站 4 即插即用 无需编程 轻松组态 ,即实现数据交互 5导轨安装 支持提供EDS文件 6 EtherNET/IP与ModBus互转数据透明传输可接入PLC组态 支持CodeSys/支持欧姆龙PLC 支持罗克韦尔(AB) 典…

FastAPI 的 quickstart

从这一章往后我们就正式开始学习 FastAPI 了 代码 FastAPI 环境安装 python 环境安装 根据要求至少需要 python 3.8及其以上&#xff0c;可以去 python 官网 自行下载安装, 本文中我们用 python 3.11 FastAPI 环境安装 pip install fastapi pip install "uvicorn[sta…

基于springboot+vue的高校办公室行政事务管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

“2024年是原生鸿蒙的关键一年&#xff0c;我们要加快推进各类鸿蒙原生应用的开发&#xff0c;集中打赢技术底座和三方生态两大最艰巨的战斗。”这是余承东在新年信中表达的决心。 随后在1月18日举行的鸿蒙生态千帆启航仪式上&#xff0c;华为宣布 HarmonyOS NEXT 鸿蒙星河版系…

Linux内存地址空间

目录 一、虚拟地址空间 1.虚拟地址空间的定义 2.虚拟地址空间的布局 二、内存壁垒 1.内存壁垒的定义​编辑 2.段错误 三、内存映射的建立与解除 &#xff08;1&#xff09;mmap &#xff08;2&#xff09;munmap &#xff08;3&#xff09;堆内存的分配和释放 1.sbrk …

springboot238光影视频

光影视频平台 摘 要 使用旧方法对光影视频平台的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在光影视频平台的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接&#xff1a;如何用ChatGPTGEEENVIPython进行高光谱&#xff0c;多光谱成像遥感数据处理&#xff1f; 第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 …

美梦从舒适开始,康姿百德床垫为睡眠健康护航

在当今社会&#xff0c;高质量的睡眠已成为人们对生活品质的追求&#xff0c;对床垫的选择也变得越来越讲究。在我们繁忙的生活中&#xff0c;一张优质的床垫不仅是我们舒适休息的保障&#xff0c;更是保持健康生活方式的重要部分。康姿百德床垫&#xff0c;作为市场上的佼佼者…