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