首页 > 极客资料 博客日记
什么是多态?面向对象中对多态的理解
2024-10-30 22:30:02极客资料围观12次
这篇文章介绍了什么是多态?面向对象中对多态的理解,分享给大家做个参考,收藏极客之家收获更多编程知识
本文原文来自:什么是多态?面向对象中对多态的理解
什么是多态
多态(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;
}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”