C++面向对象:多态性

news2024/12/23 16:16:41

多态性

1.概念

多态性是面向对象的程序设计的一个重要特征。在面向对象的方法中一般是这样表述多态的:向不同的对象发送同一个信息,不同的对象在接收时会产生不同的行为。也就是说,每个对象用自己的方式去响应共同的消息。

2.典例

下面这段程序是两段基础的面向对象的程序,他主要包含了类的定义和运算符重载和派生类的使用,我们将用这个例子来讨论多态性,不明白这个程序的小伙伴们请点击下方链接出门左转,链接顺序由浅入深,自己选择合适难度进行复习

更适合滑湿宝宝的类的定义与使用笔记-CSDN博客

面向对象教程pro:对象的初始化_面向对象将对象初始化-CSDN博客

运算符重载:妈妈我会自己写运算符了-CSDN博客

点类的定义与输出
#include<iostream>
#include<iomanip>//设置输出保留小数点后两位,防止宝宝的生日输出不完整
using namespace std;
class Point {
protected:
	float x, y;
public:
	Point(float x = 0, float y = 0) {//默认构造函数
		this->x = x;
		this->y = y;
	}
	void setPoint(float x, float y) {//重新设置某点坐标值
		this->x = x;
		this->y = y;
	}
	float getX()const { return x; };//读取x坐标
	float getY()const { return y; };//读取y坐标
	friend ostream& operator<<(ostream&output, const Point&p) {//运算符重载(只能以友元函数方式重载)
		output << "(" << p.x << "," << p.y << ")" << endl;
		return output;
	}
};
int main() {
	Point p(11.14, 11.20);
	cout << setiosflags(ios::fixed) << setprecision(2) << p;
	//这行输出与下面的输出等价,此时的流插入运算符为重载后的运算符
	p.setPoint(5.20, 13.14);//重新设置该点的坐标值
	cout << "(" << p.getX() << "," << p.getY() << ")" << endl;//此时的流插入运算符未被重载
}
 点类派生圆类并输出
#include<iostream>
#include<iomanip>//输出格式控制头文件
using namespace std;
const double pi = 3.14159;//全局变量圆周率

class Point {//基类点类
protected:
	float x, y;
public:
	Point(float x = 0, float y = 0) {//默认构造函数
		this->x = x;
		this->y = y;
	}
	void setPoint(float x, float y) {//重新设置某点坐标值
		this->x = x;
		this->y = y;
	}
	float getX()const { return x; };//读取x坐标
	float getY()const { return y; };//读取y坐标
	friend ostream& operator<<(ostream&output, const Point&p) {//运算符重载(只能以友元函数方式重载)
		output << "(" << p.x << "," << p.y << ")" << endl;
		return output;
	}
};
class Circle :public Point {//公有方式继承点类
protected:
	float radius;
public:
	Circle(float x=0,float y=0,float r=0):Point(x,y),radius(r) {	}//构造函数
	void setRadius(float r) {
		this->radius = r;
	}
	float getRadius() const {
		return radius;
	}
	float Area() const{
		//需要注意这个函数需要定义为常函数,一方面防止数据内篡改,一方面友元重载函数调用时要求函数参数为常对象
		return pi * radius * radius;
	}
	friend ostream& operator<<(ostream& output, const Circle&c) {//运算符重载(只能以友元函数方式重载)
		output << "Center: (" << c.x << "," << c.y << "), ",
			output << "r=" << c.radius,
			output << ", area=" << c.Area() << endl;
		return output;
	}
};

int main() {
	Circle c(11.14, 11.20, 5.26);
	cout << setiosflags(ios::fixed) << setprecision(2);//设置输出保留小数点后两位,防止宝宝的生日输出不完整
	cout << "the data of the origin circle is: " << endl;
	cout << "Center: (" << c.getX() << "," << c.getY() << "), r="
		<< c.getRadius() << ", area=" << c.Area() << endl;
	//因为Circle是Point类的公有派生类,因此可以调用Point中的公有权限函数
	c.setRadius(13.14);//重新设置半径
	c.setPoint(5.20, 5.21);//重新设置圆心坐标
	cout <<  c;
}

3.多态

当我们需要再派生一个圆柱类时,我们就需要计算圆柱的底面(base area)与侧面(side area),此时我们在Cylinder类中定义一个在Circle类中同名的函数:Area()const,用于计算圆柱体的侧面积,这两个函数的关系不同于重载,他们的函数名,函数参数都相同,只有函数体不同,因此我们在函数调用前需要加上我们要调用的函数所在的类名和域运算符(::),这样就确定了我们要调用的是哪个类内的函数啦~

#include<iostream>
#include<iomanip>//输出格式控制头文件
using namespace std;
const double pi = 3.14159;//全局变量圆周率

class Point {//基类点类
protected:
	float x, y;
public:
	Point(float x = 0, float y = 0) {//默认构造函数
		this->x = x;
		this->y = y;
	}
	void setPoint(float x, float y) {//重新设置某点坐标值
		this->x = x;
		this->y = y;
	}
	float getX()const { return x; };//读取x坐标
	float getY()const { return y; };//读取y坐标
	friend ostream& operator<<(ostream&output, const Point&p) {//运算符重载(只能以友元函数方式重载)
		output << "(" << p.x << "," << p.y << ")" << endl;
		return output;
	}
};
class Circle :public Point {//公有方式派生类圆类 
protected:
	float radius;//半径
public:
	Circle(float x=0,float y=0,float r=0):Point(x,y),radius(r) {	}//构造函数
	void setRadius(float r) {
		this->radius = r;
	}
	float getRadius() const {
		return radius;
	}
	float Area() const{
		//需要注意这个函数需要定义为常函数,一方面防止数据内篡改,一方面友元重载函数调用时要求函数参数为常对象
		return pi * radius * radius;
	}
	friend ostream& operator<<(ostream& output, const Circle&c) {//运算符重载(只能以友元函数方式重载)
		output << "Center: (" << c.x << "," << c.y << "), ",
		output << "r=" << c.radius,
		output << ", area=" << c.Area() << endl;
		return output;
	}
};
class Cylinder :public Circle {//公有方式派生类圆柱类
protected:
	float height;//高
public:
	Cylinder(float x = 0, float y = 0, float r = 0, float h = 0) :Circle(x, y, r), height(h) {	};
	void setHeight(float h=0) {
		this->height = h;
	}
	float getHeight()const {
		return height;
	}
	float Area() const{
		return 2 * pi * radius * height;
	}
	float Volume()const {
		return 2 * Circle::Area() + Cylinder::Area();//此处Cylinder可省略,运行结果同
	}
	friend ostream& operator<<(ostream& output, const Cylinder& c) {//运算符重载(只能以友元函数方式重载)
		output << "Center: (" << c.x << "," << c.y << "), ",
		output << "r=" << c.radius,
		output << ", base area=" << c.Circle::Area(),
		output << ", height=" << c.height,
		output << ", side area=" << c.Cylinder::Area() << endl;
		return output;
	}
};

int main() {
	Cylinder c(11.14, 11.20, 5.20, 13.14);
	cout << c;
}

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

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

相关文章

免费个人站 独立站 wordpress 自建网站

制作免费网站 | 免费网站构建器 | WordPress.com https://bioinformatics7.wordpress.com WordPress.com

第2章 Rust初体验5/8:match表达式和模式匹配:更富表达力:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.5 故事3: 比较答案与点数之和 贾克强:“同学们,我们开始用三种语言来实现故事3吧!” 2.5.1 Rust版故事3 这个故事实在是轻松容易地实现了。赵可菲照着书,一下子就写好了。 @@ -1,4 +1,5 @@use rand::Rng; +use std::cmp::Ordering;use std…

PgSQL技术内幕 - psql与服务端连接与交互机制

PgSQL技术内幕 - 客户端psql与服务端连接与交互机制 简单来说&#xff0c;PgSQL的psql客户端向服务端发起连接请求&#xff0c;服务端接收到请求后&#xff0c;fork出一个子进程&#xff0c;之后由该子进程和客户端进行交互&#xff0c;处理客户端的SQL等&#xff0c;并将结果返…

2024/06/13--代码随想录算法3/17|01背包问题 二维、01背包问题 一维、416. 分割等和子集

01背包问题 二维 卡码网链接 动态规划5步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j] &#xff1a;从下标为[0,i-1]个物品中任取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大为多少。确定递推公式&#xff0c; 有两个方向可…

JVM常用概念之扁平化堆容器

扁平化堆容器是OpenJDK Valhalla 项目提出的&#xff0c;其主要目标为将值对象扁平化到其堆容器中&#xff0c;同时支持这些容器的所有指定行为&#xff0c;从而达到不影响原有功能的情况下&#xff0c;显著减少内存空间的占用&#xff08;理想条件下可以减少24倍&#xff09;。…

使用代理IP常见问题有哪些?

代理IP在互联网数据收集和业务开展中发挥着重要作用&#xff0c;它充当用户客户端和网站服务器之间的“屏障”&#xff0c;可以保护用户的真实IP地址&#xff0c;并允许用户通过不同的IP地址进行操作。然而&#xff0c;在使用代理IP的过程中&#xff0c;用户经常会遇到一些问题…

Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置

1.template结构 <view class"content-tabs-box"><view class"content-tabs" :class"{is-fixed: isTabFixed}"><viewv-for"(item, index) in detailTabs" :key"index" class"tab" :class"{act…

pointnet

train_classification.py 把第91行修改为自己的路径&#xff0c;就可以运行了 test_cla.py&#xff0c;需要训练完才能运行测试&#xff0c;我没训练完&#xff0c;所以报错显示我没有best.pth文件 网盘里面是我运行的训练和测试的视频&#xff0c;以及源代码&#xff0c;数…

ROS 自动驾驶多点巡航

ROS 自动驾驶多点巡航&#xff1a; 1、首先创建工作空间&#xff1a; 基于我们的artca_ws&#xff1b; 2、创建功能包&#xff1a; 进入src目录&#xff0c;输入命令: catkin_create_pkg point_pkg std_msgs rospy roscpptest_pkg 为功能包名&#xff0c;后面两个是依赖&a…

新等保2.0防护体系方案

等保2.0防护体系 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 最近在写一些咨询相关的材料&…

怎么把日常的文件做二维码?适用excel、word、pdf制作二维码的方法

文件转换成二维码是将文件转成一个链接&#xff0c;将链接做成二维码之后&#xff0c;扫码就可以访问该链接中的文件内容&#xff0c;通过这种方式来实现文件的快速分享。将文件生成二维码能够随时修改内容&#xff0c;可以更新替换当前文件&#xff0c;不断的通过一个二维码来…

数据通信与网络

计算机网络的组成 计算机网络是由计算机系统、网络节点和通信链路等组成的系统。 逻辑上分为资源子网和通信子网。 CCP&#xff1a;communication control processor 通信控制处理机&#xff0c;网络节点&#xff0c;交换机、路由器等设备。 逻辑组成&#xff1a; &#xf…

二阶段提交(2pc)协议

二阶段提交&#xff08;2pc&#xff09;协议 1、 简介 二阶段提交算法是一个分布式一致性算法&#xff0c;强一致、中心化的原子提交协议&#xff0c;主要用来解决分布式事务问题。在单体spring应用中我们往往通过一个Transactional注解就可以保证方法的事务性&#xff0c;但…

线性代数|机器学习-P13计算特征值和奇异值

文章目录 1. 特征值1.1 特征值求解思路1.1 相似矩阵构造 1. 特征值 1.1 特征值求解思路 我们想要计算一个矩阵的特征值&#xff0c;一般是用如下公式&#xff1a; ∣ ∣ A − λ I ∣ ∣ 0 → λ 1 , λ 2 , ⋯ , λ n \begin{equation} ||A-\lambda I||0\rightarrow \lamb…

CPN Tools学习——时间和队列【重要】

-Timed Color Sets 时间颜色集 -Token Stamps 令牌时间戳 -Event Clock 全局/事件/模拟时钟 -Time Delays on Transitions过渡的时间延迟 - List Color Set列表颜色集 - Queue排队 1.时间颜色集 在定时CPN模型令牌中有&#xff1a; &#xff08;1&#xff09;象征性的颜…

CTFHUB-SQL注入-Cookie注入

由于本关是cookie注入&#xff0c;就不浪费时间判断注入了&#xff0c;在该页面使用 burp工具 抓包&#xff0c;修改cookie后面&#xff0c;加上SQL语句&#xff0c;关掉burp抓包&#xff0c;就可以在题目页面显示结果了 判断字段数量 发现字段数量是2列 使用id-1 union sele…

智慧工地:构筑未来建筑的智能脉络

在科技日新月异的今天&#xff0c;智慧城市的建设已不再局限于城市生活的方方面面&#xff0c;而是深入到了城市发展的每一个细胞——工地。本文旨在深度剖析智慧工地的核心价值、关键技术及对建筑业转型升级的深远影响。 一、智慧工地&#xff1a;定义与愿景 智慧工地是指运…

~$开头的临时文件是什么?可以删除吗?

&#xff08;2023.12.4&#xff09; 在进行Word文档编辑的时候&#xff0c;都会产生一个以~$开头的临时文件&#xff0c;它会自动备份文档编辑内容&#xff0c;若是正常关闭程序&#xff0c;这个文档就会自动消失&#xff1b;而在非正常情况下关闭word文档&#xff0c;如断电&…

智能座舱软件性能与可靠性的评估和改进

随着智能汽车的不断发展&#xff0c;智能座舱在性能与可靠性上暴露出体验不佳、投诉渐多的问题&#xff0c;本文从工程化的角度简述了如何构建智能座舱软件的评估框架&#xff0c;以及如何持续改进其性能和可靠性。 1. 智能座舱软件性能和可靠性表现不佳 据毕马威发布的《2023…

线程池前置知识

并发和并行 并发是指在单核CPU上&#xff0c;多个线程占用不同的CPU时间片。线程在物理上还是串行执行的&#xff0c;但是由于每个线程占用的CPU时间片非常短&#xff08;比如10ms&#xff09;&#xff0c;看起来就像是多个线程都在共同执行一样&#xff0c;这样的场景称作并发…