什么是多态?面向对象中对多态的了解
本文原文来自:什么是多态?面向目标中对多态的了解
什么是多态
多态(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;
}