说说多态,多态有几种类型,怎么实现

news/2024/12/29 17:16:43/

在这里插入图片描述多态有两种主要的类型:
静态多态(编译时多态)和动态多态(运行时多态)。

1、静态多态(编译时多态):
静态多态是指在编译时就确定了对象的类型、方法的调用以及绑定。常见的实现方式是函数重载和运算符重载。函数重载允许在同一个作用域内定义多个名称相同但参数类型或参数个数不同的函数,在编译时根据调用时传递的参数类型或个数来确定具体调用哪个函数。运算符重载则使用特殊的函数名和关键字来对运算符进行重新定义,使得它们能够按照自定义的方式操作对象。

2、动态多态(运行时多态):
动态多态是指在运行时根据对象的实际类型来调用相应的方法。它需要依赖继承和虚函数的机制来实现。在基类中声明虚函数,并在派生类中进行重写,从而使得在通过基类指针或引用调用虚函数时,根据实际指向的派生类对象来动态选择调用哪个函数。这种特性称为动态绑定或后期绑定。

在C++中,可以通过使用虚函数和指针/引用来实现动态多态。具体步骤如下:

1、在基类中声明一个虚函数(通过在函数声明前添加 virtual 关键字),该函数将在派生类中进行重写。
2、创建基类指针或引用,并将其指向派生类对象。
3、通过基类指针或引用调用虚函数,系统会根据实际指向的派生类对象来动态选择调用哪个函数。

#include <iostream>
using namespace std;class Shape {public:virtual void draw() {cout<<"Drawing a shape." <<endl;}
};class Circle : public Shape {public:void draw() override {cout<<"Drawing a circle."<<endl;}
};class Rectangle : public Shape {public:void draw() override {cout<<"Drawing a rectangle."<<endl;}
};int main() {Circle circle;			//创建了一个名为 circle 的 Circle 类对象Rectangle rectangle;Shape* shapePtr1 = &circle; //& 符号可以用于获取一个对象的地址Shape* shapePtr2 = &rectangle; shapePtr1->draw();   // 调用派生类的重写函数shapePtr2->draw();return 0;}

在这里插入图片描述

在上述代码中,基类 Shape 声明了一个虚函数 draw()。派生类 Circle 和 Rectangle 分别重写了 draw() 函数。在 main() 函数中,通过基类指针 shapePtr1 和 shapePtr2 分别指向 Circle 和 Rectangle 对象,并调用 draw() 函数。由于该函数是虚函数且派生类进行了重写,因此会根据实际指向的对象类型来动态选择调用哪个函数。


http://www.ppmy.cn/news/1074957.html

相关文章

IDEA快速设置全局JDK

出bug 了 JDK 不识别了&#xff0c;才想起来要设置jdk &#xff0c;现在一般查到的都是setting 设置全局的idea设置。但是老玩家的我怎么会不知道有一个设置全局jdk 的一个设置 setings 设置是对idea 的基础设置。 但是还有一个隐藏页面快捷键【CtrlAltShiftS】 接下来自己研究…

目标检测模型 pdf (记录链接后期学习)

参考 PaddleOCR——封装PP-Structure成一个简单的服务&#xff08;dockerfile&#xff09; 超越OCR的富文档内容解析神器LayoutParser python版面分析工具layout parser 的安装和使用 使用layout parser包分析PDF https://github.com/Layout-Parser/layout-parser ChatPDF | L…

【HBZ分享】TCP可靠性传输如何保证的?

ACK机制 ACK机制是发送方与接收方的一个相互确认客户端向服务端发送连接请求&#xff0c;此时服务端要回馈给客户端ACK&#xff0c;以表示服务端接到了客户端请求&#xff0c;这是第一和的第二次握手客户端接收到服务端响应后&#xff0c;同样也要回馈服务端的响应&#xff0c…

SpringBoot的自动装配源码分析

文章目录 一&#xff1a;什么是自动装配二、springboot的启动流程1.调用SpringApplication&#xff08;&#xff09;的构造方法2.执行核心run方法&#xff08;&#xff09;3.执行核心prepareContext&#xff08;&#xff09;4.执行核心refreshContext&#xff08;&#xff09;5…

RK3288安卓7.1开机上电到显示logo需要在3s内完成

需求&#xff1a; 从上电到开始开机logo有一段黑屏时间&#xff0c;这个黑屏时间大概在6s左右&#xff0c;给客户体验很不好&#xff0c;现在需要将这段黑屏时间缩短到2-3s左右 思路&#xff1a; 因为只需要早点显示logo&#xff0c;其实整体从上电到开机动画到安卓系统启动整体…

若依富文本 html样式 被过滤问题

一.场景 进入页面&#xff0c;富文本编辑框里回显这条新闻内容&#xff0c;如下图&#xff0c; 然后可以在富文本编辑框里对它实现再编辑&#xff0c;编辑之后将html代码提交保存到后台数据库。可以点击详情页进行查看。 出现问题&#xff1a;在提交到后台controller时&#x…

易趋亮相PMOPM大会,分享项目型业务数字化方法与实践

8月26-27日&#xff0c;第二届中国PMO&PM大会在北京、上海、深圳三地同步举行并圆满落幕。大会以“价值交付•重塑未来”为主题&#xff0c;设置了包括“项目管理方法论”、“PMO管理运营”、“组织项目治理”、“创新变革管理”、“项目管理人才”、“前沿趋势和技术”等六…

Python Flask Web开发一:环境搭建

一、创建环境 创建一个项目文件夹和一个.venv文件夹 $ mkdir myproject $ cd myproject $ python3 -m venv .venv 二、激活环境 在开始项目之前&#xff0c;请激活相应的环境 激活成功的话会在开发工具自带的终端那里看到以&#xff08;.venv&#xff09;开头的 $ . .venv…