本文原文來自:什麼是多態?面向對象中對多態的理解
什麼是多態
多態(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;
}