什么是多态?面向对象中对多态的理解
本文原文来自:什么是多态?面向对象中对多态的理解
什么是多态
多态(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: 5 p.show(3.14); // 输出: Double: 3.14 p.show("Hello"); // 输出: String: Hello return 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 + 6i return 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 function return 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 Circle shape2->draw(); // 输出: Drawing Square delete shape1; delete shape2; return 0; }
本文来自博客园,作者:张飞的猪,转载请注明原文链接:https://www.cnblogs.com/the-pig-of-zf/p/18516702
公众号:张飞的猪大数据分享,不定期分享大数据学习的总结和相关资料,欢迎关注。
个人网站"张飞的猪编程工作室"链接: https://zhangfeidezhu.com
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验