C++回顾——多态

news2024/9/23 13:16:22

一、定义

①从广义上说,多态性是指:一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过包含多态4种形式来实现。强制多态、重载多态、类型参数化多态、包含多态。
②从实现上来说,多态的分类:静态多态、动态多态。
在这里插入图片描述

二、 广义上的多态

  1. 强制多态(Coercive Polymorphism)

    • 也称为强制类型转换,允许一个类型被当作另一个类型来使用。这种多态通常涉及到隐式或显式的类型转换。
  2. 重载多态(Overloading Polymorphism)

    • 这是编译时多态的一个具体体现,包括函数重载和运算符重载。在这类多态中,同一名称的函数或运算符可以有不同的实现,这些实现根据参数类型和数量进行区分。
    • 例如,多个同名函数可以处理不同参数类型,实现了根据上下文的不同调用适当的实现。
  3. 类型参数化多态(Parametric Polymorphism)

    • 也称为泛型多态,是指函数或数据结构的行为不依赖于特定类型,而是可以在不同类型上使用。
    • C++ 中的模板(templates)就是一个例子。模板允许你编写可接受任何类型的函数或类。
    • 示例:
      template <typename T>
      T add(T a, T b) {
          return a + b;
      }
      
  4. 包含多态(Inclusion Polymorphism)

    • 指的是通过基类指针或引用来引用派生类对象,通常涉及继承和虚函数。
    • 这种多态性允许调用被重写的成员函数,从而实现运行时动态绑定。

三、 多态的实现

编译时多态和运行时多态是从多态的实现时机和机制的角度进行分类的。这两种多态各自代表了不同的编程概念和技术,主要体现在以下几个方面:

编译时多态(Compile-time Polymorphism)

  • 定义:编译时多态是在编译阶段决定具体的函数或操作,编译器根据参数类型和数量选择相应的函数实现。这种多态通常无法在运行时改变。

  • 实现机制

    • 函数重载(Function Overloading):允许同一函数名根据参数类型或数量的不同,提供不同的实现。例如:
      void print(int i);
      void print(double d);
      
    • 运算符重载(Operator Overloading):允许用户定制运算符的行为。例如:
      class Complex {
      public:
          Complex operator+(const Complex& other);
      };
      
    • 模板(Templates):可以在编译时生成针对不同类型的代码。例如:
      template <typename T>
      T max(T a, T b);
      
  • 特点

    • 在编译阶段就已确定具体的函数或操作。
    • 相对效率高,因为没有运行时开销。
    • 类型安全性好,因为所有类型检查在编译时完成。

运行时多态(Run-time Polymorphism)

  • 定义:运行时多态是在程序运行时根据对象的实际类型决定调用哪个函数。这种多态通常依赖于继承和虚函数机制。

  • 实现机制

    • 虚函数(Virtual Functions):基类中的函数声明为虚函数,允许派生类重写。在运行时,通过基类指针或引用调用转换为派生类的实现。例如:
      class Base {
      public:
          virtual void show();
      };
      
      class Derived : public Base {
      public:
          void show() override;
      };
      
      Base* b = new Derived();
      b->show();  // 根据实际对象类型调用 Derived::show()
      
  • 特点

    • 决定于运行时对象的实际类型,具有动态绑定。
    • 可能会带来一定的运行时开销(例如通过虚表实现调用),但可以实现更灵活的设计。
    • 允许动态添加和改变行为,更符合面向对象编程的特性。

总结

编译时多态和运行时多态是为了满足不同编程需求而设计的多态性机制。编译时多态多用于类型静态已知的场合,如函数重载和模板,以增强性能和类型安全。而运行时多态则为程序提供了灵活性和可扩展性,是实现多态行为的主要手段,特别是在使用继承和多态时。

四、为何引入多态?

多态是面向对象编程(OOP)中一个重要的特性,它允许使用统一的接口处理不同类型的数据和对象。引入多态有几个重要的原因:

  1. 灵活性和可扩展性

    • 多态允许程序员使用基类的指针或引用来指向派生类的对象,从而使得代码能够很容易地扩展,而无需修改已有的代码。例如,添加新的派生类只需要实现相应的方法,无需更改使用基类的任何代码。
  2. 代码复用

    • 通过使用虚函数和继承,多个类可以共享相同的接口,而不需要重复实现相似的功能。这减少了代码的重复,提高了代码的可维护性。
  3. 接口一致性

    • 用多态,客户端代码可以使用一个统一的接口来操作不同类型的对象。这意味着客户代码不需要关心具体的类类型,只需依赖基类的接口。这使得代码更易于理解。
  4. 运行时绑定

    • 多态通过动态绑定在运行时确定调用哪个方法,而不是在编译时就固定下来。这允许根据具体的对象类型来决定行为,增加了程序的灵活性。
  5. 简化程序结构

    • 使用多态,可以将复杂的控制结构(如条件分支)简化为更加简单和整洁的对象交互。例如,可以通过一个单一的接口调用不同的行为,而不需要使用大量的if条件或switch语句。
  6. 增强程序的灵活性和动态性

    • 多态使得程序能够在运行时根据用户的输入或其他变量决定使用哪个具体的实现,而不是在编译时就固定下来。这样可以使得系统更加动态和灵活。

例子

考虑一个图形程序,其中有不同的图形类型(如圆形和方形)。可以定义一个基类 Shape,然后派生出 CircleSquare 类。使用多态可以让程序使用 Shape 类型的指针或引用来处理具体的图形,而不需要关心具体的图形类型:

class Shape {
public:
    virtual void draw() = 0; // 纯虚函数
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

class Square : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a square." << std::endl;
    }
};

// 使用多态
void renderShape(Shape* shape) {
    shape->draw(); // 调用具体形状的 draw 方法
}

int main() {
    Circle circle;
    Square square;

    renderShape(&circle); // 输出: Drawing a circle.
    renderShape(&square); // 输出: Drawing a square.

    return 0;
}

在这个例子中,无论是 Circle 还是 Square,都可以通过 Shape 接口来处理,使得代码更加可扩展和灵活。

总之,多态是构建灵活、可维护和可扩展的面向对象设计的基石,其引入极大地提升了软件开发的效率和质量。

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

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

相关文章

云原生安全检测工具(容器安全、trivy、veinmind-tools)

目录 trivy 功能 扫描方式&目标 安装 漏洞库下载及更新 漏洞库扫描原理 官方漏洞库生成 使用 扫描镜像 扫描 wazuh-daemonset 所有漏洞 扫描 wazuh-daemonset 高危、严重漏洞(漏洞过滤) 扫描文件系统 Git 存储库漏洞扫描 报告输出格式 veinmind-tools 1.…

Vue的学习(一)

目录 一、Vue的介绍 二、指令 1.v-text 2.v-html 3.v-show 4.v-if 1&#xff09;v-if与v-show的区别 5.v-else 6.v-else-if 7.v-for 1)v-for 与v-if的优先级 8.v-on&#xff1a;click 9.v-bind 10.v-model 三、表单修饰符 1. .lazy 修饰符 2. .number修饰符…

算法通关:014_2:用队列实现栈

文章目录 题目思路问题总结导包有问题&#xff0c;java提供的有关队列的方法不能调用。queue.add()和queue.offer(n)&#xff0c;这两个方法有什么区别什么叫用LinkedList实现队列 代码结果 题目 LeetCode 225. 用队列实现栈 思路 问题总结 导包有问题&#xff0c;java提供的…

银行业数据分析的关键应用场景探索

“ 随着数字经济的蓬勃发展&#xff0c;银行业正经历着前所未有的变革。从传统的存贷款业务到如今的数字化服务&#xff0c;数据分析在银行中扮演着核心角色。本文将探讨银行业数据分析的主要场景&#xff0c;以及选型适配银行业分析需求的数据库技术。” 国内的商业化银行大体…

二维码直达App,Xinstall为你打通运营任督二脉

在移动互联网时代&#xff0c;App的推广和运营显得尤为重要。然而&#xff0c;许多企业在投入大量资源进行App推广和运营时&#xff0c;总会遇到一些棘手的问题&#xff0c;如用户转化率低、数据分析困难等。今天&#xff0c;我们要为大家揭秘一个神奇的助手——Xinstall&#…

RocketMQ5.0 生产者

生产者消息类型&#xff1a; 延迟队列的生产者 package mainimport ("context""fmt""github.com/apache/rocketmq-clients/golang/v5""github.com/apache/rocketmq-clients/golang/v5/credentials"errgroup2 "golang.org/x/sync…

实现函数返回字符的种类

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 例如&#xff1a; 分别输入&#xff1a;a B 6分别输出&#xff1a;# * &#xff1f; 二、思路 第一步 获取键盘输入的字符&#xff0c;键盘输入的话…

服务器 Linux 的文件系统初探

好久没更新文章了&#xff0c;最近心血来潮&#xff0c;重新开始知识的累计&#xff0c;做出知识的沉淀~ 万事万物皆文件 文件系统&#xff1a;操作系统如何管理文件&#xff0c;内部定义了一些规则或者定义所以在 Linux 中所有的东西都是以文件的方式进行操作在 Linux 中&am…

Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget

文章目录 一、常见Linux发行版本二、Linux中yum、rpm、apt-get、wget的区别2.1 yum2.2 rpm2.3 apt-get2.4 wget2.5 总结 三、CentOS中yum的作用3.1 yum清空缓存列表3.2 yum显示信息3.3 yum搜索、查看3.4 yum安装3.5 yum删除、卸载程序3.6 yum包的升级、降级 四、Ubuntu中apt-ge…

线段树、贪心与推销员

[NOIP 2015] 推销员 - 洛谷 核心&#xff1a;利用线段树处理贪心内容。建两个线段树维护两端。 #include<bits/stdc.h> using namespace std; int n; int d[100100]; int t[1000100]; int deep;//当前最深 int ans; struct node{int id,mx; }; struct sgt{int a[10001…

8.1-java+tomcat环境的配置+代理

一、回顾 1.安装nodejs&#xff0c;这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行…

技术详解:互联网医院系统源码与医保购药APP的整合开发策略

本篇文章&#xff0c;小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…

AI大模型需要什么样的数据?

数据将是未来AI大模型竞争的关键要素 人工智能发展的突破得益于高质量数据的发展。例如&#xff0c;大型语言模型的最新进展依赖于更高质量、更丰富的训练数据集&#xff1a;与GPT-2相比&#xff0c;GPT-3对模型架构只进行了微小的修改&#xff0c;但花费精力收集更大的高质量…

【pyhton】Python中zip用法详细解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

请你学习:前端布局1 - CSS盒模型(Box Model)是CSS布局的核心概念之一

CSS盒模型&#xff08;Box Model&#xff09;是CSS布局的核心概念之一&#xff0c;它描述了如何对文档中的元素进行布局和尺寸计算。每个元素都会生成一个矩形的盒子&#xff0c;这个盒子由几个部分组成&#xff0c;包括内容&#xff08;content&#xff09;、内边距&#xff0…

解决Tomcat控制台打印日志出现乱码

1.进入安装目录&#xff0c;找到conf这个文件夹并打开 2.找到logging.properties&#xff0c;用记事本打开 3.找到java.util.logging.ConsoleHandler.encoding&#xff0c;将UTF-8修改为GBK

红酒与时尚秀场:品味潮流与风尚

在光影交织的时尚秀场上&#xff0c;每一道流光溢彩都诠释着潮流与风尚的碰撞。当定制红酒洒派红酒&#xff08;Bold & Generous&#xff09;与时尚秀场相遇&#xff0c;两者交织出一段优雅而充满魅力的故事&#xff0c;领着我们品味潮流之巅的风尚。 一、红酒与时尚的初遇…

【MySQL进阶篇】管理

1、系统数据库 MySQL数据库安装完成之后&#xff0c;自带以下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息&#xff08;时区、主从、用户、权限等&#xff09;information_schema提供了访问数据库元数据的各种表…

摄像头防抖中的IMU传感器是什么吗?

摄像头防抖中的IMU传感器是什么吗&#xff1f; 在现代摄影与摄像技术的飞速发展中&#xff0c;防抖功能作为提升画质与用户体验的关键技术之一&#xff0c;得到了广泛的应用与重视。IMU&#xff08;Inertial Measurement Unit&#xff0c;惯性测量单元&#xff09;传感器作为防…