极简c++(8)抽象类与多态

news2024/11/24 0:59:17

类型转换规则

父类定义的指针可以指向子类对象;
在这里插入图片描述
在这里插入图片描述
指针会误以为,他们指向的对象是Base1类型,导致错误;

虚函数定义

在这里插入图片描述
在这里插入图片描述

多态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何实现多态:
1.创建类的继承关系图
2.所以类对象都可以调用的这个函数
3.创建父类指针数组
4.子类的地址赋给父类指针
5.指针调用虚函数

动态绑定

和多态其实是一个概念
在这里插入图片描述
动态绑定我们是无法在运行之前,事先知道运行的结果是不知道的;
在这里插入图片描述
不仅是指针,引用也可以!
在这里插入图片描述
指针和引用可以,但最后一种情况无法实现多态

虚析构函数

在这里插入图片描述

在这里插入图片描述
创建的时候是先创建base再创建derived的;这个时候,不加virtual 的话会导致,只delete了base,但没有delete掉derived;
建议所有析构函数都加virtual
只有用new去创建的时候,才有可能出现这种错误。

纯虚函数与抽象类

在这里插入图片描述
对于暂时无法实现的函数,我们可以定义为纯虚函数,留给派生类去实现;
定义了纯虚函数的类叫抽象类;
抽象类只能作为基类来使用;
构造函数不能是虚函数,析构函数可以是虚函数;

为什么需要抽象类

在这里插入图片描述
在这里插入图片描述

抽象类的特点

在这里插入图片描述

作业

在这里插入图片描述
main.cpp

#include "shape.h"
#include "circle.h"
#include "rectangle.h"
#include "roundrectangle.h" 
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(void) {
	shape *ptrShape[6];
	circle circle1;
	circle circle2("red",2);
	Rectangle Rectangle1,Rectangle2("green",2,3);
	RoundRectangle RoundRectangle1,RoundRectangle2("yelow",2,3,1);
	ptrShape[0] = &circle1;
	ptrShape[1] = &circle2;
	ptrShape[2] = &Rectangle1;
	ptrShape[3] = &Rectangle2;
	ptrShape[4] = &RoundRectangle1;
	ptrShape[5] = &RoundRectangle2;
	
//	ptrShape[0] = new circle;
//	ptrShape[1] = new Rectangle;
//	ptrShape[2] = new RoundRectangle;
//	ptrShape[3] = new circle("red",2);
//	ptrShape[4] = new Rectangle("red",2,3);
//	ptrShape[5] = new RoundRectangle("red",2,3,1);
	for(int i=0;i<6;i++){
		cout<<"该图形面积为:"<<ptrShape[i]->getArea()<<endl;
	}
	return 0;
}

shape.cpp

#include "shape.h"
#include <iostream>
using namespace std;		
	shape::shape():color("white"){
		cout<<"无参创建shape"<<endl;
	}
	shape::shape(string color){
		this->color = color;
		cout<<"有参创建shape"<<endl;
	}
	shape::~shape(){
		cout<<"消亡shape"<<endl;
	}
	string shape::getColor(){
		return this->color;
	}
	void shape::setColor(char color){
		this->color = color;
	}
	void shape::display(){
		cout<<"color:"<<getColor()<<endl;
	}

shape.h

#ifndef SHAPE_H
#define SHAPE_H
#include <string>
#include <iostream>
using namespace std;
class shape{
	private:
		string color;
	public:
		shape();
		shape(string color);
		virtual ~shape();			//析构函数+virtual 
		string getColor();
		void setColor(char color);
		void display();
		virtual double getArea()=0; //纯虚函数,变成抽象类 
};

#endif

circle.cpp

#include "circle.h"
#include "shape.h"
#include <iostream>
	const double pi = 3.14;
	circle::circle(){
		radius = 1;
		cout<<"无参创建circle"<<endl;
	}
	circle::circle(string color,double radius):shape(color){
		this->radius = radius;
		cout<<"有参创建circle"<<endl;
	}
	circle::~circle(){
		cout<<"消亡circle"<<endl;
	}
	double circle::getRadius(){
		return this->radius;
	}
	void circle::setradius(double radius){
		this->radius = radius;	
	}
	double circle::getArea(){
		return pi*radius*radius;
	}
	void circle::display(){
		shape::display();
		cout<<"R="<<getRadius()<<","<<"Area="<<getArea()<<endl;
	}

circle.h

#ifndef CIRCLE_H
#define CIRCLE_H
#include <string>
#include "shape.h"

class circle:public shape{
	private:
		double radius;
	public:
		circle();
		circle(string color,double radius);
		virtual ~circle();
		void setradius(double radius);
		double getRadius();
		double getArea();
		void display();
};



#endif

rectangle.cpp

#include "rectangle.h"
#include "shape.h"
#include <iostream>

	Rectangle::Rectangle(){
		width = 1;
		height = 1;
		cout<<"无参创建Rectangle"<<endl;
	}
	Rectangle::Rectangle(string color,double width,double height):shape(color){
		this->width = width;
		this->height = height;
		cout<<"有参创建Rectangle"<<endl; 
	}
	Rectangle::~Rectangle(){
		cout<<"消亡Rectangle"<<endl;
	}
	double Rectangle::getWidth(){
		return width; 
	}
	double Rectangle::getHeight(){
		return height;
	}
	void Rectangle::setWidth(double width){
		this->width = width;
	}
	void Rectangle::setHeight(double height){
		this->height = height;
	}
	double Rectangle::getArea(){
		return width*height;
	}
	void Rectangle::display(){
		shape::display();
		cout<<"width="<<getWidth()<<","<<"Height="<<getHeight()<<","<<"Area="<<getArea()<<endl;
	}

rectangle.h

#ifndef RECTANGLE_H
#define RECTANGLE_H
#include <string>
#include "shape.h"

class Rectangle:public shape{
	private:
		double width;
		double height;
	public:
		Rectangle();
		Rectangle(string color,double width,double height);
		virtual ~Rectangle();
		void setWidth(double width);
		void setHeight(double height);
		double getWidth();
		double getHeight();
		double getArea();
		void display();
};


#endif

roundrectangle.cpp

#include "roundrectangle.h"
#include "rectangle.h"
#include"shape.h"
#include <iostream>
	RoundRectangle::RoundRectangle(){
		this->roundRadius = 1;
		cout<<"无参创建RoundRectangle"<<endl; 
	}
	RoundRectangle::RoundRectangle(string color,double width,double height,double roundRadius):Rectangle(color,width,height){
		this->roundRadius = roundRadius;
		cout<<"有参创建RoundRectangle"<<endl;
	}
	RoundRectangle::~RoundRectangle(){
		cout<<"消亡RoundRectangle"<<endl; 
	}
	double RoundRectangle::getRoundradius(){
		return roundRadius;
	}
	void RoundRectangle::setRoundradius(double roundRadius){
		this->roundRadius = roundRadius;
	}
	double RoundRectangle::getArea(){
		return Rectangle::getWidth()*Rectangle::getHeight()+(3.14*roundRadius*roundRadius)/2;
	}
	void RoundRectangle::display(){
		shape::display();
		cout<<"width="<<Rectangle::getWidth()<<","<<"Height="<<Rectangle::getHeight()<<","<<"Area="<<getArea()<<endl;
	}

roundrectangle.h

#ifndef ROUNDRECTANGLE_H
#define ROUNDRECTANGLE_H
#include <string>
#include "rectangle.h"

class RoundRectangle:public Rectangle{
	private:
		double roundRadius;
	public:
		RoundRectangle();
		RoundRectangle(string color,double width,double height,double roundRadius);
		virtual ~RoundRectangle();
		void setRoundradius(double roundRadius);
		double getRoundradius();
		double getArea();
		void display();
};


#endif

在这里插入图片描述
(1)必须要定义,因为getArea()是纯虚函数,派生类必须补全他的函数实现,否则Circle也会变成抽象类,无法创建对象
(2)不会,因为它可以调用他的父类Rectangle类的getArea(),编译不出错,但内容是错误的
(3)可以。但
在这里插入图片描述

#include "shape.h"
#include "circle.h"
#include "rectangle.h"
#include "roundrectangle.h" 
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

double sumArea(shape* shapes[],int n){
	double sum = 0;
	for(int i = 0 ;i<n;i++){
		sum += shapes[i]->getArea();
	}
}

int main(void) {
	shape *ptrShape[6];
	circle circle1;
	circle circle2("red",2);
	Rectangle Rectangle1,Rectangle2("green",2,3);
	RoundRectangle RoundRectangle1,RoundRectangle2("yelow",2,3,1);
	ptrShape[0] = &circle1;
	ptrShape[1] = &circle2;
	ptrShape[2] = &Rectangle1;
	ptrShape[3] = &Rectangle2;
	ptrShape[4] = &RoundRectangle1;
	ptrShape[5] = &RoundRectangle2;
	
//	ptrShape[0] = new circle;
//	ptrShape[1] = new Rectangle;
//	ptrShape[2] = new RoundRectangle;
//	ptrShape[3] = new circle("red",2);
//	ptrShape[4] = new Rectangle("red",2,3);
//	ptrShape[5] = new RoundRectangle("red",2,3,1);
	for(int i=0;i<6;i++){
		cout<<"该图形面积为:"<<ptrShape[i]->getArea()<<endl;
	}
	cout<<"总面积"<<sumArea(ptrShape,6)<<endl;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch 深度学习之卷积神经网络(高级篇)Advanced CNN(十)

0. Revision 前面讲的比较简单的是 串行网络结构 1. GoogLeNet 1.1 Inception module w h 要一致 what is 11 convolution? 信息融合-eg.高中各门学科成绩比较(总分) 最主要工作:改变通道数量 why is 11 convolution? 减少10倍 1.2 implementation of inception module 拼…

一文1400字从0到1进行Jmeter分布式压力测试【图文并茂】

1、场景 在做性能测试时&#xff0c;单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机器&#xff0c;使用UI方式&#xff0c;最高压测在1800并发(RT 20ms以内)左右。如果…

在C语言中,单向链表的插入操作通常包括以下哪些步骤?

#科技新势力# #极简极速学编程# 【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【C语言每日一题】 在C语言中&#xff0c;单向链表的插入操作通常包括以下哪些步骤&#xff1f; A选项&#xff1a;将新节点指针->指向->链表最后一个节点 B选项&#xff1…

2024级199管理类联考之逻辑核心基础

且与或 含义 A且B(A^B):同时存在 常见形式 A并且B既A又B不但A而且B虽然A但是BA或B:二者至少有一个成立(即A且非B,非A且B,A且B) 否定形式 且的否定 A且B否定形式&#xff1a;非(A^B) 非A 或 非B非A且非B否定形式&#xff1a;非(非A^非B) A 或 B非A且B否定形式&#xff1a;…

c# xml 参数读取读取的简单使用

完整使用之测试参数的读取&#xff08;xml&#xff09; 保存一个xml文档&#xff08;如果没有就会生成一个默认的 里面的参数用的是我们默认设置的&#xff09;&#xff0c;之后每次更改里面的某项&#xff0c;然后保存 类似于重新刷新一遍。 这里所用的xml测试参数前面需要加…

淘宝天猫2023年双11红包活动入口在哪里活动时间是什么时候开始至什么时间结束2023年天猫淘宝双十一超级红包活动?

2023年淘宝天猫双11超级红包活动领取时间是从2023年10月24日20:00开始至11月11日23:59结束&#xff0c;淘宝天猫双十一活动时间内每天都可以领取1超级红包最高可得23888元。 2023年天猫淘宝双十一红包使用时间分为2个阶段&#xff1a;第一阶段是从2023年10月31日20:00开始至11…

螺杆支撑座对注塑机的生产过程有哪些重要影响?

螺杆支撑座对注塑机的生产过程具有重要影响&#xff0c;主要体现在以下几个方面&#xff1a; 1、精度和稳定性&#xff1a;螺杆支撑座能够提高注塑机的精度和稳定性&#xff0c;从而保证塑料制品的品质和一致性。通过提供稳定的支撑和承载&#xff0c;螺杆支撑座可以减少机器运…

高防CDN:网络安全的不可或缺之选

在当今数字化时代&#xff0c;网络攻击已经成为互联网上的一种不可避免的风险。为了应对不断升级的网络威胁&#xff0c;许多企业和组织正在采用高防御CDN&#xff08;Content Delivery Network&#xff09;技术&#xff0c;以确保他们的在线资产得到保护&#xff0c;用户体验得…

python 机器视觉 车牌识别 - opencv 深度学习 机器学习 计算机竞赛

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…

JDBC封装查询单个和查询多个

Mybatis在转化时候可以将数据库任意类型全转字符串是没有问题的 下面封装存在一个问题就是需要数据库字段类型与实体类字段类型一致 实体类 //String columnName metaData.getColumnName(i 1); 这个方法返回实际列名 String columnLabel metaData.getColumnLabel(i 1);//该…

查看系统的核心信息

查看系统的版本 cat /etc/redhat-release查看系统的主机名 hostname uname -n 查看内核 uname -r查看网卡信息 ip a ifconfig 查看网关 ip route route -n netstat -rn 查看分区black大小 df -h 查看磁盘block大小 df -i 查看磁盘和分区大小 fdisk -l查看内存大小…

竞赛选题 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

Delay-Based 拥塞控制算法

上班七天了&#xff0c;有点崩溃&#xff0c;看一篇论文提神&#xff1a;A Delay-Based Approach for Congestion Avoidance in Interconnected Heterogeneous Computer networks&#xff0c;来自 Raj Jain&#xff0c;1989 年。这篇论文基于下图展开&#xff1a; 是不是很熟…

基于DBC Signal Group生成Autosar SR接口(2)

文章目录 前言m脚本生成BUS数据类型建立Input模块及关联对应的BUS数据类型实现效果总结 前言 上一篇文章中&#xff0c;介绍了DBC中SignalGroup的提取&#xff0c;对于已经提取好的Group信息&#xff0c;就可以批量操作生成Simulink BUS及Simulink接口模型了。本文介绍这部分的…

Element el-table 表格内容 样式错乱的问题

表格切换样式错乱展示 因为切换行的高度变化可能未异步渲染 解决方法&#xff1a; 在需要使用v-if渲染的el-table-column元素上加上一个不重复的key值即可解决问题 :key“Math.random()” <el-table-columnprop""label"问题"width"630.5px":…

你不一定知道的四种遍历进程的方法(c语言)

一、前言 有时候写代码的时候&#xff0c;我们需要遍历出系统的一些进程&#xff0c;一般我们是直接在任务管理器中查看&#xff0c;不过我们也可以自己写一个&#xff0c;下面小编将会从三个方面着手&#xff0c;给大家讲讲如何遍历进程。 二、系统快照 一般会用到了3个关键…

智慧公厕管理系统

在当今快速发展的科技时代&#xff0c;智慧城市管理成为了城市发展的重要趋势。而智慧公厕管理系统作为其中的一个重要组成部分&#xff0c;为公共卫生设施的管理提供了全新的解决方案&#xff0c;引领着智慧城市管理科技的新篇章。 一、智慧公厕管理系统的概念 什么是智慧公…

【基于windows desktop上的docker配置nacos,并采用宿主机访问】

1、拉取镜像&#xff08;以下命令全部基于powershell&#xff09; docker pull nacos/nacos-server2、启动容器 docker run -d -e PREFER_HOST_MODEhostname -e MODEstandalone -e JVM_XMS256m -e JVM_XMX256m -e JVM_XMN128m -p 8848:8848 --name nacos --restartalways nac…

VL53L5CX驱动开发(3)----检测阈值

VL53L5CX驱动开发----3.检测阈值 概述实现demo视频教学样品申请源码下载生成STM32CUBEMX选择MCU串口配置IIC配置 INT设置配置使能与复位X-CUBE-TOF1串口重定向代码配置TOF代码配置Kcps/SPAD定义状态说明演示结果 概述 本章展示如何使用VL53L5CX近接传感器的"检测阈值&quo…

vscode用密钥文件连接ssh:如果一直要输密码怎么办

commandshiftP&#xff1a;打开ssh配置文件 加上这么一段&#xff0c;host就是你给主机起的名字 对IdentityFile进行更改&#xff0c;改成相应的密钥文件 然后commandshiftP链接到主机就可以了 但是有时候它会让输入密码 这是由于你给这个IdentityFile的权限太多了&#xf…