C++面向对象:多态性

多态性

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.rhkb.cn/news/349553.html

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

相关文章

MPLS提高网络服务质量的原理

MPLS&#xff08;Multiprotocol Label Switching&#xff0c;多协议标签交换&#xff09;是一种网络技术&#xff0c;它能够提高网络的服务质量&#xff08;Quality of Service&#xff0c;QoS&#xff09;以及整体性能。MPLS通过以下几种方式来提升网络服务质量&#xff1a;标…

Unity引擎在UI上渲染粒子播放

大家好&#xff0c;我是阿赵。   在UI上面显示粒子特效&#xff0c;如果把粒子系统直接拖到Canvas里面&#xff0c;会存在很多问题&#xff0c;比如层级问题、裁剪问题等。这里分享一种用MaskableGraphic和UIVertex来显示粒子特效的方法。 一、 MaskableGraphic和UIVertex简…

r语言数据分析案例25-基于向量自回归模型的标准普尔 500 指数长期预测与机制分析

一、背景介绍 2007 年的全球经济危机深刻改变了世界经济格局&#xff0c;引发了一系列连锁反应&#xff0c;波及各大洲。经济增长停滞不前&#xff0c;甚至在某些情况下出现负增长&#xff0c;给出口导向型发展中国家带来了不确定性。实体经济受到的冲击尤为严重&#xff0c;生…

[qt] qt程序打包以及docker镜像打包

目录 一 环境准备: 1.1 qt环境 1.2 linuxdeplouqt打包工具 二 qt包发布: 2.1 搜索链接库 2.2 应用程序APP打包 2.3 发布 三 docker镜像包发布 3.1 环境准备 3.2 镜像生产脚本 3.3 加载镜像并运行docker容器 四 补充 4.1 时间不同步问题解决 一 环境准备: qt环境l…

2024-06-07 Unity 编辑器开发之编辑器拓展8 —— Scene 窗口拓展

文章目录 1 Handles 类1.1 Scene 响应函数1.2 自定义窗口中监听 Scene1.3 Handles 常用 API2.2.1 颜色控制2.2.2 文本2.2.3 线段2.2.4 虚线2.2.5 圆弧2.2.6 圆2.2.7 立方体2.2.8 几何体2.2.9 移动、旋转、缩放2.2.10 自由移动 / 旋转 2 Scene 窗口中显示 GUI3 HandleUtility4 G…

用Python代码锁定Excel单元格以及行和列

Excel能够帮助用户高效地组织数据&#xff0c;还支持复杂的公式计算和数据分析。而随着团队协作的日益频繁&#xff0c;保护数据的准确性和完整性变得尤为重要。在Excel表格中&#xff0c;我们可以通过锁定特定的单元格或区域&#xff0c;防止对单元格内容进行随意修改&#xf…

C++面向对象程序设计 - 命名空间

命名空间是ANSI C引入的可以由用户命名的作用域&#xff0c;用来处理程序中常见的同名冲突。 在C语言中定义了三个层次的作用域&#xff0c;即文件&#xff08;编译单元&#xff09;、函数和复合语句。C又引入了类作用域&#xff0c;类是出现在文件内的。在不同的作用域中可以定…

14.shell awk数组

awk数组 awk数组awk数组示例Nginx日志分析 awk数组 1.什么是awk数组 数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值 2.awk数组应用场景 通常用来统计、比如:统计网站访问TOP10、网站url访问TOP10等等 3.awk数组统计技巧 1.在awk中,使用数组时,不仅可以…

ceisum只聚合效果展示

忙于开发三维引擎的扩展功能&#xff0c;实在时间太少了&#xff0c;仓促截几张图&#xff0c;看一下聚合效果。 1.聚合又文字标签 四种效果&#xff1a;如下 2.聚合无文字标签

Docker(一)-认识Docker

1.docker理念 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装&#xff0c;分发&#xff0c;部署&#xff0c;运行等生命周期的管理&#xff0c;使用户的应用及其运行环境能够做到”…

jenkins使用注意问题

1.在编写流水线时并不知道当前处在哪个目录&#xff0c;导致名使用不当&#xff0c;以及文件位置不清楚 流水线任务默认路径是&#xff0c;test4_mvn为jenkins任务名 [Pipeline] sh (hide)pwd /var/jenkins_home/workspace/test4_mvn maven任务也是&#xff0c;看来是一样的…

CV每日论文--2024.6.14

1、ICE-G: Image Conditional Editing of 3D Gaussian Splats 中文标题&#xff1a;ICE-G&#xff1a;3D 高斯斑点的图像条件编辑 简介&#xff1a;近年来,出现了许多技术来创建高质量的3D资产和场景。然而,当涉及到这些3D对象的编辑时,现有方法要么速度慢、要么牺牲质量,要么…

数组(C语言)(详细过程!!!)

目录 数组的概念 一维数组 sizeof计算数组元素个数 二维数组 C99中的变⻓数组 数组的概念 数组是⼀组相同类型元素的集合。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般比较多见的是二维数组。 从这个概念中我们就可以发现2个有价值的信息&#xff1a;(1)数…

flask_sqlalchemy时间缓存导致datetime.now()时间不变问题

问题是这样的&#xff0c;项目在本地没什么问题&#xff0c;但是部署到服务器过一阵子发现&#xff0c;这个时间会在某一刻定死不变。 重启uwsgi后&#xff0c;发现第一条数据更新到了目前最新时间&#xff0c;过了一会儿再次发送也变了时间&#xff0c;但是再过几分钟再发就会…

软件测试--Mysql快速入门

文章目录 软件测试-mysql快速入门sql主要划分mysql常用的数据类型sql基本操作常用字段的约束&#xff1a;连接查询mysql内置函数存储过程视图事务索引 软件测试-mysql快速入门 sql主要划分 sql语言主要分为&#xff1a; DQL&#xff1a;数据查询语言&#xff0c;用于对数据进…

基于Verilog表达的FSM状态机

基于Verilog表达的FSM状态机 1 FSM1.1 Intro1.2 Why FSM?1.3 How to do 在这里聚焦基于Verilog的三段式状态机编程&#xff1b; 1 FSM 1.1 Intro 状态机是一种代码实现功能的范式&#xff1b;一切皆可状态机&#xff1b; 状态机编程四要素&#xff1a;– 1.状态State&#…

通用大模型与垂直大模型:双轨并进的人工智能未来

在人工智能(AI)的浩瀚宇宙中&#xff0c;大模型以其强大的学习能力和广泛的适用性&#xff0c;正逐步成为推动技术进步和产业革新的核心动力。在这股浪潮中&#xff0c;通用大模型与垂直大模型如同两颗璀璨的星辰&#xff0c;各自散发着独特的光芒&#xff0c;共同照亮了AI发展…

STL入门指南:从容器到算法的完美结合

目录 ​编辑 一、什么是STL 二、STL的版本 三、STL的六大组件 1. 容器&#xff08;Containers&#xff09;&#xff1a; 2. 算法&#xff08;Algorithms&#xff09;&#xff1a; 3. 迭代器&#xff08;Iterators&#xff09;&#xff1a; 4. 仿函数&#xff08;Functo…

中国算力基础设施“第一阵营”变局?

2024年6月IDC最新数据显示&#xff0c;2024年第一季度&#xff0c;联想服务器跃升至中国市场份额第三位。中国算力基础设施“第一阵营”正生变局。 在去年服务器本地化品牌联想问天发布之后&#xff0c;联想就发出了向国内服务器市场冲锋的信号。如今仅一年&#xff0c;就进入…

工业4.0下的PLC进化论:ARMxy计算机如何重塑自动化

智能物流系统的高效与精准成为企业竞争力的关键。在这个背景下&#xff0c;传统的PLC系统因其固有的局限性&#xff0c;如扩展性差、系统封闭等&#xff0c;开始显得力不从心。ARMxy工业计算机作为新一代的PLC替代方案&#xff0c;凭借其低功耗、高性能以及高度的灵活性&#x…