C++ 多态:探索对象的动态行为

C++ 多态:探索对象的动态行为

在这里插入图片描述
在C++中,多态性是一种强大的特性,它允许我们通过基类指针或引用来调用派生类的方法。多态性不仅增加了程序的灵活性,还使得代码更加易于扩展和维护。本文将深入探讨C++中的多态性,包括静态多态(主要通过函数重载和模板实现)和动态多态(主要通过虚函数和抽象基类实现)。

一、多态性的概念

多态性(Polymorphism)字面意思为“多种形态”,在面向对象编程中,它指的是同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态性分为编译时多态(静态多态)和运行时多态(动态多态)。

二、静态多态

静态多态主要通过函数重载和模板实现,它在编译时就已经确定了具体调用的函数或模板实例。

1. 函数重载

函数重载允许在同一个作用域内定义多个同名函数,只要它们的参数列表(参数个数、类型或顺序)不同即可。编译器会根据函数调用时的实参类型、个数和顺序来选择合适的函数版本。

#include <iostream>
using namespace std;void print(int i) {cout << "Printing int: " << i << endl;
}void print(double f) {cout << "Printing float: " << f << endl;
}int main() {print(5);       // 调用 print(int)print(5.5);     // 调用 print(double)return 0;
}
2. 模板

模板是C++中另一种实现静态多态的机制,它允许在编译时根据模板参数的类型生成特定的函数或类。

#include <iostream>
using namespace std;template<typename T>
void print(T value) {cout << value << endl;
}int main() {print(5);       // 实例化 print<int>(int)print(5.5);     // 实例化 print<double>(double)return 0;
}
三、动态多态

动态多态主要通过虚函数和抽象基类实现,它在运行时根据对象的实际类型来确定调用哪个函数。

1. 虚函数

在基类中,将成员函数声明为virtual,表示该函数可以在派生类中被重写(Override)。通过基类指针或引用调用虚函数时,会根据指针或引用所指向对象的实际类型来调用相应的函数版本。

#include <iostream>
using namespace std;class Base {
public:virtual void display() {cout << "Base class display" << endl;}virtual ~Base() {} // 虚析构函数,确保派生类对象正确析构
};class Derived : public Base {
public:void display() override { // 使用override关键字明确表示这是一个重写函数cout << "Derived class display" << endl;}
};int main() {Base* b = new Derived();b->display(); // 输出: Derived class displaydelete b;return 0;
}
2. 抽象基类

含有至少一个纯虚函数(函数声明后加= 0)的类称为抽象基类。抽象基类不能直接实例化对象,但可以作为基类使用,强制派生类实现基类的纯虚函数。

#include <iostream>
using namespace std;class Shape {
public:virtual void draw() const = 0; // 纯虚函数virtual ~Shape() {}
};class Circle : public Shape {
public:void draw() const override {cout << "Drawing Circle" << endl;}
};int main() {Shape* s = new Circle();s->draw(); // 输出: Drawing Circledelete s;return 0;
}
四、总结

多态性是面向对象编程中非常重要的概念,它提高了代码的复用性和可扩展性。在C++中,通过静态多态(函数重载和模板)和动态多态(虚函数和抽象基类)的实现,我们可以灵活地处理不同类型对象的行为。掌握多态性,对于深入理解面向对象编程和设计模式具有重要意义。

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

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

相关文章

代理高并发如何去解决?

代理高并发问题的解决方法涉及多个层面&#xff0c;包括架构设计、资源优化、技术选型等方面。以下是一些具体的解决方案&#xff1a; 1. 架构设计 分布式架构&#xff1a; 微服务架构&#xff1a;将大型应用拆分为多个小型服务&#xff0c;每个服务独立部署、扩展和升级&…

沪金和伦敦金一致吗?什么因素在作怪?

沪金也就是上海金&#xff0c;是上海黄金交易所推出的一款的黄金投资理财交易品种&#xff0c;其交易特性与国际市场上的伦敦金相类似&#xff0c;二者都是采用双向式杠杆保证金交易。但它们也有不同之处&#xff0c;比如货币和重量的计价单位的差异&#xff0c;伦敦金是用美元…

汽修工厂的安全守护者!防滑耐磨劳保鞋,匠心守护你的每一步

在城市的喧嚣中&#xff0c;有这样一群匠人&#xff0c;他们手持扳手&#xff0c;脚踏油渍&#xff0c;用汗水与智慧守护着机械的脉动——他们就是汽修工人。面对飞溅的油渍、尖锐的金属部件以及不时滑动的地面&#xff0c;汽修工人们需要时刻保持警惕&#xff0c;确保工作安全…

Spring Cloud Eureka快读入门Demo

1.什么是Eureka&#xff1f; Eureka 由 Netflix 开发&#xff0c;是一种基于REST&#xff08;Representational State Transfer&#xff09;的服务&#xff0c;用于定位服务&#xff08;服务注册与发现&#xff09;&#xff0c;以实现中间层服务的负载均衡和故障转移&#xff…

Java小白入门到实战应用教程-开发环境搭建-IDEA2024安装激huo详细教程

writer:eleven 安装IDEA2024 一、下载IDEA 推荐大家去官网下载 我这里也给大家直接准备了安装包&#xff0c;和激huo教程&#xff0c;大家可以自行下载使用。 注意&#xff1a;激huo教程只用于学习交流&#xff0c;不可商用。 IDEA2024安装包及激huo教程 说明&#xff1a…

HCIE之Qos(十七)

QoS 一、哪些问题会影响网络的数据传输二、QoS服务模型三、IntServ3.1 资源预留的过程分为5步3.2 资源预留方式可分为两类&#xff1a; 四、DiffServ五、分类和标识的方法5.1、二层标记方法5.2、三层标记方法5.2.1 传统的IPP方式 六、拥塞管理&#xff08;队列技术&#xff09…

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同&#xff0c;分别是input_size&#xff0c;hidden_size和num_layer foward函数也与RNN类似&#xff0c;只不过返回值除了out外&#xff0c;ht变为(ht,ct) 代码见下图&#xff1a; 2. nn.LSTMCell 初…

【保姆级】Python项目部署到Linux生产环境(uwsgi+python+flask+nginx服务器)

1.安装python 我这里是3.9.5版本 安装依赖&#xff1a; yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y 根据自己的需要下载对应的python版本&#xff1a; cd /usr/local wget https://www.python.or…

利用联邦学习和基于自动编码器模型的分布式学习架构

首先&#xff0c;在每个训练回合中&#xff0c;随机选择一个客户子集&#x1d45a; &#x1d45a;&#x1d44e;&#x1d465;(&#x1d436;&#x1d43e;, 1)参加当前回合&#xff0c;使得 C 是被选中参与的客户的比例&#xff1b; 其次&#xff0c;每个客户端接收全局模型…

SAP ABAP性能优化

1.前言 ABAP作为SAP的专用的开发语言&#xff0c;衡量其性能的指标主要有以下两个方面&#xff1a; 响应时间&#xff1a;对于某项特定的业务请求&#xff0c;系统在收到请求后需要多久返回结果 吞吐量&#xff1a;在给定的时间能&#xff0c;系统能够处理的数据量 2. ABAP语…

虚拟专用服务器有哪些应用?

虚拟化技术是一种可以让多个用户共享服务器资源的工具。它通过创建虚拟服务器来实现&#xff0c;这些虚拟服务器被分配了一定数量的内存、磁盘和 CPU 时间以便运行。这些虚拟服务器彼此独立&#xff0c;并为用户提供专用服务器的所有选项。这些虚拟专用服务器有许多名称&#x…

LabVIEW鼠标悬停在波形图上的曲线来自动显示相应点的坐标

步骤 创建事件结构&#xff1a; 打开LabVIEW&#xff0c;创建一个新的VI。 在前面板上添加一个Waveform Graph控件。 在后面板上添加一个While Loop和一个事件结构&#xff08;Event Structure&#xff09;。 配置事件结构&#xff0c;选择Waveform Graph作为事件源&#xf…

利用 VAE、GAN 和 Transformer 释放生成式 AI

利用 VAE、GAN 和 Transformer 释放生成式 AI 文章目录 一、介绍1.1 学习目标1.2 定义生成式 AI 二、生成式 AI 的力量三、变分自动编码器 &#xff08;VAE&#xff09;3.1 定义编码器和解码器模型3.2 定义采样函数3.3 定义损失函数3.4 编译和训练模型 四、生成对抗网络 &#…

Spring Framework各种jar包官网下载2024年最新下载官方渠道。

Spring其实就是一个大家族&#xff0c;它包含了Spring Framework&#xff0c;Spring Boot等一系列技术&#xff0c;它其实就是由许许多多的jar包构成&#xff0c;我们要使用Spring的框架&#xff0c;就要去下载支持这个框架的jar包即可。 1.官网下载Spring Framework的jar包 官…

java通过jwt生成Token

定义 JWT&#xff08;JSON Web Token&#xff09;简而言之&#xff0c;JWT是一个加密的字符串&#xff0c;JWT传输的信息经过了数字签名&#xff0c;因此传输的信息可以被验证和信任。一般被用来在身份提供者和服务提供者间传递被认证用户的身份信息&#xff0c;以便于从资源服…

React@16.x(60)Redux@4.x(9)- 实现 applyMiddleware

目录 1&#xff0c;applyMiddleware 原理2&#xff0c;实现2.1&#xff0c;applyMiddleware2.1.1&#xff0c;compose 方法2.1.2&#xff0c;applyMiddleware 2.2&#xff0c;修改 createStore 接上篇文章&#xff1a;Redux中间件介绍。 1&#xff0c;applyMiddleware 原理 R…

iOS——MRC与ARC以及自动释放池深入底层学习

MRC与ARC再回顾 在前面&#xff0c;我们简单学了MRC与ARC。MRC指手动内存管理&#xff0c;需要开发者使用retain、release等手动管理对象的引用计数&#xff0c;确保对象在必要时被释放。ARC指自动内存管理&#xff0c;由编译器自动管理对象的引用计数&#xff0c;开发者不需要…

基于springboot和mybatis的RealWorld后端项目实战一之hello-springboot

新建Maven项目 注意archetype选择quickstart pom.xml 修改App.java App.java同级目录新增controller包 HelloController.java package org.example.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotatio…

浅析stm32启动文件

浅析stm32启动文件 文章目录 浅析stm32启动文件1.什么是启动文件&#xff1f;2.启动文件的命名规则3.stm32芯片的命名规则 1.什么是启动文件&#xff1f; 我们来看gpt给出的答案&#xff1a; STM32的启动文件是一个关键的汇编语言源文件&#xff0c;它负责在微控制器上电或复位…

【简历】惠州某二本学院:前端简历指导,秋招面试通过率为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届二本同学&#xff0c;投递前端职位的简历&#xff0c;那么在校招环节二本同学主要针对的还是小公司&#xff0c;这个学校因为…