什么是多态?面向对象中对多态的理解

本文原文来自:什么是多态?面向对象中对多态的理解

什么是多态

多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许对象以多种形式出现。多态性使得同一个接口可以用于不同的数据类型,从而使得代码更加灵活和可扩展。

简单来说,多态就是一个接口,一个类,一个抽象类,一个类里面的方法,不同类的同一个方法,都可以有多种实现,这个在面向对象里面,就对应着继承、重载、重写等具体的方式。

多态的优点优点:

  • 灵活性:多态性允许同一个接口用于不同的对象,从而使得代码更加灵活。
  • 可扩展性:可以在不修改现有代码的情况下,通过添加新的类来扩展程序的功能。
  • 代码重用:通过多态性,可以编写更加通用和可重用的代码。

多态性是面向对象编程中的一个重要特性,它允许对象以多种形式出现,从而使得代码更加灵活和可扩展。通过编译时多态(如函数重载和运算符重载)和运行时多态(如虚函数和接口),可以实现不同的多态性行为。

多态的类型

多态性主要分为两种类型:

  • 编译时多态(静态多态):
    • 函数重载(Function Overloading):同一个函数名可以有不同的参数列表,从而实现不同的功能。
    • 运算符重载(Operator Overloading):允许用户定义或重定义运算符的行为。
  • 运行时多态(动态多态):
    • 虚函数(Virtual Functions):通过基类指针或引用调用派生类的函数,实现动态绑定。
    • 接口和抽象类:通过接口或抽象类定义统一的接口,不同的类可以实现这些接口,从而实现多态性。

编译时多态的例子

函数重载

#include <iostream>class Print {
public:void show(int i) {std::cout << "Integer: " << i << std::endl;}void show(double d) {std::cout << "Double: " << d << std::endl;}void show(const std::string& s) {std::cout << "String: " << s << std::endl;}
};int main() {Print p;p.show(5);          // 输出: Integer: 5p.show(3.14);       // 输出: Double: 3.14p.show("Hello");    // 输出: String: Helloreturn 0;
}

运算符重载

#include <iostream>class Complex {
public:double real, imag;Complex(double r = 0, double i = 0) : real(r), imag(i) {}Complex operator + (const Complex& other) {return Complex(real + other.real, imag + other.imag);}void display() {std::cout << real << " + " << imag << "i" << std::endl;}
};int main() {Complex c1(3.0, 4.0), c2(1.0, 2.0);Complex c3 = c1 + c2;c3.display();  // 输出: 4 + 6ireturn 0;
}

运行时多态的例子

虚函数

#include <iostream>class Base {
public:virtual void show() {std::cout << "Base class show function" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived class show function" << std::endl;}
};int main() {Base* basePtr;Derived derivedObj;basePtr = &derivedObj;basePtr->show(); // 输出: Derived class show functionreturn 0;
}

接口和抽象类

#include <iostream>class Shape {
public:virtual void draw() = 0; // 纯虚函数
};class Circle : public Shape {
public:void draw() override {std::cout << "Drawing Circle" << std::endl;}
};class Square : public Shape {
public:void draw() override {std::cout << "Drawing Square" << std::endl;}
};int main() {Shape* shape1 = new Circle();Shape* shape2 = new Square();shape1->draw(); // 输出: Drawing Circleshape2->draw(); // 输出: Drawing Squaredelete shape1;delete shape2;return 0;
}

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

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

相关文章

Redisson(二)SpringBoot集成Redisson

目录 一、Redis单例模式 二、Redis哨兵模式 三、Redis集群模式 四、主从模式 五、兼容多种模式的配置&#xff08;重点&#xff09; 1、pom 2、配置文件 &#xff08;1&#xff09;application.properties &#xff08;2&#xff09;application-dev.properties &…

eclipse下载与安装(汉化教程)超详细

目录 一、下载eclipse安装包 三、配置eclipse 代码自动补全功能 安装汉化包 中英文切换 四、用eclipse写hello world 一、下载eclipse安装包 1、首先进入 eclipse官网 如下&#xff1a; 2、这里面有很多版本&#xff1b;我们小白一般选择第二个&#xff0c;向下滑动&…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…

Nop平台核心代码阅读导引

Nop平台核心引擎的实现代码都很简短&#xff0c;一般模块的核心代码量都是5000行左右的量级&#xff0c;只有ORM比较复杂一些&#xff0c;1万多行。 虽然代码很短&#xff0c;实际实现的功能特性却很多&#xff0c;要把所有细节设计都介绍到&#xff0c;文档量还是不小。建议有…

RHCE笔记-DNS服务器

一.DNS简介 DNS&#xff08;域名系统&#xff09;是一种互联网服务&#xff0c;负责将我们熟悉的域名&#xff08;比如 www.example.com&#xff09;转换为计算机能理解的IP地址&#xff08;比如 192.0.2.1&#xff09;。这样&#xff0c;当你在浏览器中输入网址时&#xff0c;…

利用QGIS工具手动绘制线轨迹并生成地理信息geojson文件

前端想要获得一个完整的shp文件或者geojson的地理信息文件&#xff0c;可以利用QGIS工具手动绘制你想要的数据点位&#xff0c;然后导出图层生成对应的文件即可。 1、新建临时图层 选择线图层&#xff0c;点击ok创建临时图层。 2、绘制线图层 在工具栏中选择添加线要素&#…

关于IO多路复用

先说总结 IO 多路复用的概念可以从网络 IO 的阻塞模型谈起。早期网络编程通常依赖阻塞的 read 函数读取数据&#xff0c;这会导致线程被阻塞&#xff0c;无法处理其他任务。为避免线程阻塞&#xff0c;常使用多线程来处理新的客户端连接。然而&#xff0c;随着客户端连接数的增…

面试记录(1)

java中的抽象类和接口的区别&#xff1a; 相同点 (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 不同点 1.关键字不同&#xff1a; ​ ① 继承抽象类的关键字是extends&#xff0c;而实现接口的关键字是implements&#xff1b;…

【rust实战】rust博客系统3_项目目录结构及文件目录引入

项目中如何文件目录分层 blog Cargo.toml --依赖项 src main.rs --主文件 handlers --处理用户请求的函数 user_handler.rs mod.rs models --定义用户模型 user.rs mod.rs routes --定义路由 user_ro…

构建您自己的 RAG 应用程序:使用 Ollama、Python 和 ChromaDB 在本地设置 LLM 的分步指南

在数据隐私至关重要的时代&#xff0c;建立自己的本地语言模型 &#xff08;LLM&#xff09; 为公司和个人都提供了至关重要的解决方案。本教程旨在指导您完成使用 Ollama、Python 3 和 ChromaDB 创建自定义聊天机器人的过程&#xff0c;所有这些机器人都托管在您的系统本地。以…

聊聊Web3D 发展趋势

随着 Web 技术的不断演进&#xff0c;Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来&#xff0c;由于 WebGL、WebGPU 等技术的发展&#xff0c;3D 内容已经能够直接在浏览器中渲染&#xff0c;为用户提供更加沉浸、互动的体验。以…

同一个页面击穿element样式后,会影响同样组件的使用

问题&#xff1a;同一个页面里&#xff0c;我用deep击穿第一个dialog后&#xff0c;怎么不影响第二个dialog。 解决&#xff1a;使用更具体的选择器 给新的对话框一个特定的类名或者ID&#xff0c;然后为这个类名或ID下的 .el-dialog 使用 :deep() 选择器。这样&#xff0c;样式…

电科金仓(人大金仓)更新授权文件(致命错误: XX000: License file expired.)

问题:电科金仓(人大金仓)数据库链接异常,重启失败,查看日志如下: 致命错误: XX000: License file expired. 位置: PostmasterMain, postmaster.c:725 解决方法: 一、下载授权文件 根据安装版本在官网下载授权文件(电科金仓-成为世界卓越的数据库产品与服务提供商)…

阿里云ECS访问GitHub解决方案

使用阿里云 ECS 访问 Github 和拉取代码时&#xff0c;速度非常慢&#xff0c;等于不可用。 本解决方案适用于墙内所有云服务器。 修改系统hosts方式 阻碍 GitHub 访问的一般手段是 DNS 污染&#xff0c;可以通过修改hosts的方式暂时缓解。 访问 ipaddress.com,获取github.co…

uniapp的video视频属性打包app后层级过高

问题&#xff1a;在使用uniapp开发APP时&#xff0c;使用video标签显示视频发现H5可以正常展示&#xff0c;但是打包到APP后&#xff0c;它的层级过高&#xff0c;把底部导航都盖住了。 官网说明&#xff1a;uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

考研资料分享系统的设计与实现(lw+演示+源码+运行)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

[perl] 数组与哈希

数组变量以 符号开始&#xff0c;元素放在括号内 简单举例如下 #!/usr/bin/perl names ("a1", "a2", "a3");print "\$names[0] $names[0]\n"; print "size: ",scalar names,"\n";$new_names shift(names); …

项目符合行业安全标准的必要步骤与实用建议

要保障项目符合行业安全标准&#xff0c;关键在于建立全面的安全管理体系、定期进行风险评估、持续培训员工&#xff0c;以及确保合规性文件和审核流程完整。例如&#xff0c;通过建立合规文件和审核流程&#xff0c;可以系统性地跟踪项目的安全实践和合规性&#xff0c;使安全…

小米15和小米15 Pro区别没那么大,但也得看准再下手

小米15和小米15 Pro区别大总结 接下来&#xff0c;我们将从关键差别等多个方面来分析两个机型的具体区别&#xff08;Ps&#xff1a;只聊不一样的&#xff0c;没提到就是一样的&#xff09;&#xff1a; 关键差别 • 屏幕素质&#xff1a;小米15采用的是6.36英寸1.5K&#xf…

【科研绘图】3DMAX管状图表生成插件TubeChart使用方法

3DMAX管状图表生成插件TubeChart&#xff0c;一款用于制作3D管状图表的工具。可以自定义切片的数量以及随机或指定切片颜色。 【版本要求】 3dMax 2008及更高版本 【安装方法】 TubeChart插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中打开即可&#xff0…