C++ 多态性(Polymorphism)和 虚函数(Virtual Functions)

在 C++ 中,多态性(Polymorphism)是面向对象编程的一个重要概念,它允许通过基类指针或引用来调用派生类对象的特定方法。虚函数(Virtual Functions)是实现多态性的一种机制,通过在基类中声明虚函数,并在派生类中进行重写,可以实现动态绑定,使程序在运行时确定应该调用哪个函数。

下面我将详细解释多态性和虚函数的概念,并提供一个示例来说明它们的用法。

  1. 多态性:
    多态性是指同一种操作或方法在不同的对象上产生不同的行为。在面向对象编程中,多态性通过继承和重写函数来实现。它允许我们使用基类的指针或引用来调用派生类的特定方法,从而实现针对不同对象的不同行为。

  2. 虚函数:
    虚函数是在基类中声明的函数,可以在派生类中进行重写。通过在基类函数声明中添加 virtual 关键字,可以指示编译器在运行时进行动态绑定,根据对象的实际类型选择调用哪个函数。

    以下是一个示例,展示了多态性和虚函数的用法:

  #include <iostream>class Shape {public:virtual void draw() {std::cout << "绘制一个形状" << std::endl;}};class Circle : public Shape {public:void draw() override {std::cout << "绘制一个圆形" << std::endl;}};class Rectangle : public Shape {public:void draw() override {std::cout << "绘制一个矩形" << std::endl;}};int main() {Shape* shape1 = new Circle();Shape* shape2 = new Rectangle();shape1->draw(); // 输出:绘制一个圆形shape2->draw(); // 输出:绘制一个矩形delete shape1;delete shape2;return 0;}

在这个示例中,我们定义了一个基类 Shape,并在其中声明了一个虚函数 draw。然后,派生类 CircleRectangle 分别重写了 draw 函数。

main 函数中,我们使用 Shape 的指针分别创建了 CircleRectangle 的对象,并通过基类指针调用它们的 draw 函数。由于 draw 函数在基类中被声明为虚函数,因此在运行时会根据对象的实际类型选择调用相应的函数。这就实现了多态性,使得我们可以通过基类指针来调用派生类的特定函数。

输出结果为:

   绘制一个圆形绘制一个矩形

当我们有一个基类 Animal 和两个派生类 DogCat 时,我们可以使用多态性和虚函数来实现不同类型的动物发出不同的声音。

#include <iostream>class Animal {
public:virtual void makeSound() {std::cout << "动物发出声音" << std::endl;}
};class Dog : public Animal {
public:void makeSound() override {std::cout << "狗发出汪汪声" << std::endl;}
};class Cat : public Animal {
public:void makeSound() override {std::cout << "猫发出喵喵声" << std::endl;}
};int main() {Animal* animal1 = new Dog();Animal* animal2 = new Cat();animal1->makeSound(); // 输出:狗发出汪汪声animal2->makeSound(); // 输出:猫发出喵喵声delete animal1;delete animal2;return 0;
}

在这个示例中,Animal 是一个基类,其中的 makeSound 函数被声明为虚函数。派生类 DogCat 分别重写了 makeSound 函数。在 main 函数中,我们使用基类指针分别创建了 DogCat 的对象,并通过这些指针调用了 makeSound 函数。

由于 makeSound 函数在基类中被声明为虚函数,因此在运行时会根据对象的实际类型选择调用相应的函数。这就实现了多态性,使得我们可以通过基类指针来调用派生类的特定函数。

输出结果为:

狗发出汪汪声
猫发出喵喵声

通过多态性和虚函数,我们可以根据对象的实际类型来调用相应的函数,从而实现了不同类型的动物发出不同的声音。这种灵活性和可扩展性使得我们能够轻松地添加新的派生类,并在不改变现有代码的情况下扩展程序的功能 , 使得程序能够根据对象的实际类型来调用相应的函数。这种灵活性和可扩展性使得代码更具有适应性和可维护性。

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

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

相关文章

InputStream和OutputStream速通

InputStream和OutputStream 输入流&#xff08;InputStream&#xff09;&#xff1a; InputStream是抽象类&#xff0c;用于从各种数据源&#xff08;如文件、网络连接、内存等&#xff09;读取字节流。常见的子类包括FileInputStream、ByteArrayInputStream和SocketInputStrea…

电源小白入门学习1——电源系统架构和相关指标

电源小白入门学习1——电源系统架构和相关指标 电源系统架构电源系统的指标及测量方法电源的效率电源的静态电流输出电压调整率纹波测量的注意事项动态负载测试 在开始本期内容之气&#xff0c;我先简单介绍一下我们电源小白学习系列内容&#xff1a;首先我是一个嵌入式小白&am…

【InsCode】新的代码管理工具inscode教程它和Git以及SVN的区别

InsCode 实践分享 InsCodeGitSVN类型代码管理工具分布式版本控制系统集中式版本控制系统分支管理支持强大的分支管理功能&#xff0c;包括创建、合并和删除分支支持分支管理&#xff0c;操作简单快捷支持分支管理&#xff0c;但操作相对复杂代码托管提供代码托管功能&#xff…

在VSCode中运行Python脚本文件时如何传参

以下实验所处的操作系统环境说明&#xff1a; OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中写好 Python 脚本后&#xff0c;如果要运行起来&#xff0c;可以怎么做呢&#xff1f; 一般有以下几种方式&#xff1a; 1、直接在 VSCode…

sentinel整合nacos配置中心持久化

在网上找了很多的资料&#xff0c;发现sentinel整合nacos持久化的博文和视频大多数都只有改造限流部分的教程&#xff0c;并且都需要修改前端&#xff0c;略显麻烦&#xff0c;至于剩下的熔断、热点流控、授权的更是没有相关的改造教程&#xff0c;最后在知乎的看到一篇文章后让…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

pytorch学习4-简易卷积实现

系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换&#xff08;ReLU和sigmoid&#xff09;pytorc…

【鸿蒙学习网络】

鸿蒙技术学习相关学习资料 官方文档&#xff1a;华为官方提供了鸿蒙开发者文档&#xff0c;包括开发指南、API参考和示例代码等。您可以访问华为开发者中心网站&#xff08;https://developer.harmonyos.com/&#xff09;获取最新的官方文档和教程。在 线 课 程 &#xff1a; …

PbootCMS 前台RCE漏洞复现

0x01 产品简介 PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要 0x02 漏洞概述 PbootCMS v<=3.1.6版本中存在模板注入,攻击者可构造特定的链接利用该漏洞,执行…

线程及实现方式

一、线程 线程是一个基本的CPU执行单元&#xff0c;也是程序执行流的最小单位。引入线程之后&#xff0c;不仅是进程之间可以并发&#xff0c;进程内的各线程之间也可以并发&#xff0c;从而进一步提升了系统的并发度&#xff0c;使得一个进程内也可以并发处理各种任务&#x…

c语言的内存函数

memcpy函数 1.调用形式void*memcpy(void*p1,void*p2,int n)&#xff0c;表示从第二个位置复制n个字节到第一个位置&#xff0c;而指针类型为void的原因是他可以复制整型字符型甚至指针结构体类型的数据 2.在遇到\0的时候不会停下来&#xff0c;因为函数执行拷贝靠字节数&…

【Hive】——安装部署

1 MetaData&#xff08;元数据&#xff09; 2 MetaStore &#xff08;元数据服务&#xff09; 3 MetaStore配置方式 3.1 内嵌模式 3.2 本地模式 3.3 远程模式 4 安装前准备 <!-- 整合hive --><property><name>hadoop.proxyuser.root.hosts</name><v…

Java+Swing: 主界面组件布局 整理9

说明&#xff1a;这篇博客是在上一篇的基础上的&#xff0c;因为上一篇已经将界面的框架搭好了&#xff0c;这篇主要是将里面的组件完善。 分为三个部分&#xff0c;北边的组件、中间的组件、南边的组件 // 放置北边的组件layoutNorth(contentPane);// 放置中间的 Jtablelayou…

Tair(3):Tair入门demo

新建一个maven项目 1 导入依赖 <dependency><groupId>com.taobao.tair</groupId><artifactId>tair-client</artifactId><version>2.3.5</version></dependency><dependency><groupId>com.alibaba</groupId>…

计算日期到天数转换

根据输入的日期&#xff0c;计算是这一年的第几天。 保证年份为4位数且日期合法。 输入描述&#xff1a;输入一行&#xff0c;空格分割&#xff0c;分别是年&#xff0c;月&#xff0c;日 输出描述&#xff1a;输出是这一年的第几天 输入&#xff1a;2012 12 31 输出&#xff…

Python计时器

制作一个简单的Python计时器 在本教程中&#xff0c;我们将学习如何使用Python制作一个基础的计时器。这个计时器将能够开始计时、暂停、继续和重置时间。 设计思路 为了建立一个计时器&#xff0c;我们需要定义一个能够跟踪时间的变量&#xff0c;并且定期更新显示的时间。…

Linux权限(用户角色+文件权限属性)

Linux权限 文章目录 Linux权限一.文件权限1.快速掌握修改权限的方法&#xff08;修改文件权限属性&#xff09;2.对比权限的有无&#xff0c;以及具体的体现3.修改权限的第二套方法&#xff08;修改用户角色&#xff09;4.文件类型&#xff08;Linux下一切皆文件&#xff09; 二…

049:VUE 引入jquery的方法和配置

第049个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场&#xff08;deprecated&#xff09;GEORADIUS 获取指定成员附件的停车场&#xff08;deprecated&…

文心一言API(高级版)使用

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的智能文本对话AI机器…