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

news/2025/3/11 10:00:53/文章来源:https://www.cnblogs.com/the-pig-of-zf/p/18516702

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

什么是多态

多态(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.hqwc.cn/news/824382.html

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

相关文章

HarmonyOS:DevEco Profiler调优工具

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18515687➤如果链接不是为敢技术的博客园…

基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现九

可以二次开发 前台功能:首页、诗文、作者、名句、成语、赏析、翻译、典籍、注册、登录、个人中心等。 后台功能:作者列表、古诗词列表、名句列表、成语列表、典籍列表、用户管理、赏析管理、翻译管理等。 部分功能: 前台赏析信息控制器Controller、前台典籍信息控制器Contro…

基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现十

可以二次开发 前台功能:首页、诗文、作者、名句、成语、赏析、翻译、典籍、注册、登录、个人中心等。 后台功能:作者列表、古诗词列表、名句列表、成语列表、典籍列表、用户管理、赏析管理、翻译管理等。 部分功能: 前台个人中心信息控制器Controller、前台翻译信息控制器Co…

KMC数据库设计

存一下密钥管理中心数据库,免得找不到了具体表格:表名 列名 数据类型 主键 外键Keys KeyID INT PKKeyValue VARBINARY(256)KeyType VARCHAR(50)CreatedAt DATETIMEExpirationDate DATETIMEStatus ENUMKey_Pools PoolID INT PKPoolName ENUMDescription VARCHAR(255)Key_Pool_…

【设计模式】异步阻塞、异步回调模式

1 前言 为什么要看这个异步回调呢?是因为我上节在看 RocektMQ 发送消息的时候,它支持同步、异步、一次性的模式,后两者不会阻塞当前线程,但是看这两者都没用到线程池,那它是如何处理的呢?我们看下三者最后的落点,都是在 NettyRemotingAbstract 这个类里:// NettyRemot…

DBeaver如何生成select,update,delete,insert语句

前言 我们在使用DBeaver时,经常是需要查看数据库表的。有时候,我们需要用DBeaver生成select,update,delete,insert等语句,这样可以使我们方便的开发代码,那么应该怎么生成呢? 如何生成语句 首先,我们点击下我们要生成语句的表,右键点击。然后,我们点击下生成SQL选项…

CF1802 题解

CF1802 题解 A likes 最大值一定是一个前缀全部关注, 一个后缀全部取关. 最小值一定是一个前缀关注完立刻取关, 后面全部是关注. 模拟即可. B Settlement of Guinea Pigs 那些未确定性别的只能每个单独占一个笼子, 其他的需要我们去分配. 如果有 \(m\) 个松鼠被确定性别了, 其中…

DBeave如何查看数据库表的DDL创建语句

前言 我们在使用DBeave时,有时候是需要看一下某个表的创建语句的,这样方便我们在其他数据库创建该表。 那么,我们呢应该如何查看表的创建语句呢? 如何查看DDL 首先,我们选择我们要查看的数据库表,然后鼠标双击下该表。然后,我们点击下上方的属性,然后在下面再点下DDL选…

20222424 2024-2025-1 《网络与系统攻防技术》实验三实验报告

20222424 2024-2025-1 《网络与系统攻防技术》实验三实验报告 1.实验内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程(2)通过组合应用各种技术…

人工智能实验报告1

​ 姓名:熊俊松________________________ 班级:2220422__________________________________ 学号:20222024234_______________________ 实验题目:___________________________ **回归 **___________________________________ 实验目的:掌握回归算法的编程实现细节,要求…

数据采集与融合技术第三次作业

作业内容 作业①: 要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。 –务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。 主要代码:…

2024年网鼎杯青龙组 pwn

pwn2 开局泄露栈地址,又是栈溢出,直接栈转移拿下 from pwn import * from LibcSearcher import LibcSearcher #from Crypto.Util.number import bytes_to_long,bytes_to_long #--------------------setting context--------------------- context.clear(arch=amd64, os=linux…