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.mzph.cn/news/852593.shtml

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

相关文章

R语言绘制三变量分区地图

参考资料&#xff1a; https://mp.weixin.qq.com/s/5c7gpO2mJ2BqJevePJz3CQ tricolore包教程&#xff1a;https://github.com/jschoeley/tricolore 学习笔记&#xff1a;Ternary choropleth maps 1、测试实例 代码&#xff1a; library(ggplot2) library(rnaturalearthdata) …

android studio4.1后不能ButterKnife

麻蛋L最近发现 android studio不能使用ButterKnife啦&#xff01;ButterKnife Injections不维护&#xff0c;butterknife Zelezny也不维护&#xff01;&#xff01;&#xff01;日…难受&#xff0c;兄弟们换下一家&#xff1a;IDsCreate&#xff0c;一毛一样的好用&#xff01…

TCP/IP协议简要介绍

TCP/IP for IP version 4&#xff08;IPv4&#xff09;是一种网络协议&#xff0c;Microsoft Windows使用该协议通过internet与其他计算机进行通信。理想情况下&#xff0c;只要基于Windows的计算机通过网络进行通信&#xff0c;就会使用TCP/IP。 本文介绍TCP/IP协议的组成、协…

蓝牙模块与其他无线技术的比较与选择

在无线通信技术日新月异的今天&#xff0c;蓝牙模块、WiFi、Zigbee和NFC等技术都发挥着至关重要的作用。它们在智能设备、工业自动化、智能家居等多个领域得到广泛应用&#xff0c;各自拥有独特的优点和局限性。本文将对这几种无线技术进行详细的比较&#xff0c;分析它们的优缺…

接口自动化测试工程化——了解接口测试

什么是接口测试 接口测试也是一种功能测试 我理解的接口测试&#xff0c;其实也是一种功能测试&#xff0c;只是平时大家说的功能测试更多代指 UI 层面的功能测试&#xff0c;而接口测试更偏向于服务端层面的功能测试。 接口测试的目的 测试左移&#xff0c;尽早介入测试&a…

vlc多媒体播放器(支持各种本地视频、网络视频、音频及摄像头直播地址)winform(支持全屏)自动适应x86、x64平台插件及重要代码

1、学习vlcControl1及libvlc.dll类方法(x86为例)最新v3.0.21 1.1 本博文以控件(vlcControl1)方式为主介绍 1.2 安装-引用,添加控件到窗体 using Vlc.DotNet.Forms; 1.3 窗体布局、编写代码 打开文件(以本地媒体文件为主)打开地址(以网络媒体地址为主)播放|暂停功能停…

VMware清理拖拽缓存

磁盘空间越用越小&#xff0c;如何快速解决磁盘空间的问题&#xff0c;甩掉烦恼 安装VM tools之后可以通过拖拽的方式把文件拉入虚拟机之中。但每一次拖拽&#xff0c;其实都是现在cache文件夹里面生成一个同样的文件&#xff0c;并使用cp拷贝的方式将其拷贝到拖拽放置的目录中…

C# WPF入门学习主线篇(二十六)—— 绑定路径和数据上下文

C# WPF入门学习主线篇&#xff08;二十六&#xff09;—— 绑定路径和数据上下文 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;数据绑定是一个核心概念&#xff0c;它允许你将UI控件的属性与数据源属性进行绑定&#xff0c;从而实现数据和UI的…

05-腾讯云Copilot及 向量数据库AI套件介绍

1 Andon Copilot核心功能介绍 2 Andon Copilot覆盖腾讯云售后、售前场景 3 腾讯云向量数据库– AI套件效果 AI 套件是腾讯云向量数据库&#xff08;Tencent Cloud VectorDB&#xff09;提供的一站式文档检索解决方案&#xff0c;包含自动化文档解析、信息补充、向量化、内容检…

HTTPS请求阶段图解分析

HTTPS请求阶段分析 请求阶段分析 请求阶段分析 一个完整、无任何缓存、未复用连接的 HTTPS 请求需要经过以下几个阶段&#xff1a; DNS 域名解析、TCP 握手、SSL 握手、服务器处理、内容传输。 一个 HTTPS 请求共需要 5 个 RTT 1 RTT&#xff08;域名解析&#xff09; 1 RTT…

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

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

H5单点登录分析介绍(登录状态检验状态透传分析)

文章目录 1、单点登录解决方案1.1、后端保存登录状态1.2、token模式 2、user服务-登录接口2.1、UserController2.2、UserInfoServiceImpl2.3、载荷2.4、响应2.5、Redis Desktop Manager 3、user服务-登录成功获取用户信息回显3.1、UserController3.2、UserInfoServiceImpl3.3、…

Unity资源 之 最受欢迎的三消游戏开发包 - Bubble Shooter Kit 【免费领取】

三消游戏开发包 - Bubble Shooter Kit 免费领取 前言资源包内容领取兑换码 前言 如果你是一名 Unity 游戏开发者&#xff0c;并且正在寻找一种快速、简单的方式来创建自己的三消游戏&#xff0c;那么 Bubble Shooter Kit 就是你所需要的。 资源包内容 Bubble Shooter Kit 是…

英文语法工具Grammarly for Word下载和安装

前言&#xff1a;论文写作语法检查和润色的时候&#xff0c;可以用Grammarly进行帮助。 Grammarly for Word的下载、安装、使用 官网下载Grammarly for Microsoft Office安装GrammarlyWord使用GrammarlyGrammarly使用 官网下载Grammarly for Microsoft Office 地址&#xff1…

【全开源】ChatGPT 机器人公众号小程序h5源码开源交付支持二开

AI机器人系统对接OPENAI&#xff1a;智能互联的无限可能 &#x1f310; 一、引言&#xff1a;AI机器人系统与OPENAI的碰撞 在科技日新月异的今天&#xff0c;AI机器人系统正逐渐渗透到我们生活的各个角落。而当这一智能系统与全球领先的OPENAI技术相结合&#xff0c;又将擦出…

【CT】LeetCode手撕—33. 搜索旋转排序数组

目录 题目1-思路1-1 模式识别&#xff1a;1-2 二分模板 && 本质二分红色边界二分绿色边界 1-3 本题思路①二分出第一个区间②判断 target 在哪个区间③利用二分性质 2- 实现⭐33. 搜索旋转排序数组——题解思路 3- ACM实现 题目 原题连接&#xff1a;33. 搜索旋转排序…

MathTpye7最新版软件下载与安装步骤2024最新新手小白教程

在2024年&#xff0c;作为软件开发者的你&#xff0c;一定知道MathType这款广受欢迎的数学公式编辑器吧&#xff01;&#x1f4f1;&#x1f50b;&#x1f4b0;&#x1f9ee; MathType是一款功能强大的数学公式编辑工具。无论是学术研究&#x1f4da;还是数字教育&#x1f469;‍…

火车头采集怎么使用GPT等AI原创文章

火车头采集官方并没有GPT、百度文心一言AI、阿里通义千问AI、Kimi大模型等AI功能&#xff0c;但支持接入插件&#xff0c;可以编写相应人工智能AI原创文章插件&#xff08;火车头采集支持PHP和c#这2种语言的插件编写&#xff09;&#xff0c;或者导入第三方封装好的GPT等AI原创…

【收藏】Web 前端知识体系精简【文末福利!】赠2024Web 前端/安全工程师资料视频教程+源码+课件

目录 JAVASCRIPT 篇 0、基础语法 1、函数原型链 2、函数作用域 3、函数指针 this 4、构造函数 new 5、闭包 6、单线程和异步队列 7、异步通讯 Ajax技术 8、DOM对象 document 9、事件系统 Event 10、全局对象 window CSS 篇 1、选择器 2、定位 3、浮动 4、盒子…

人脸识别系统---人脸对比

一、人脸对比 1.定义全局变量来存储选择的图片路径和标签 save_image1 None save_image2 None image_label1 None image_label2 None2.定义了一个名为compare_faces的函数&#xff0c;用于比较两张图片中的人脸是否相似 def compare_faces():if save_image1 and save_im…