什麼是多型?物件導向中對多型的理解

张飞的猪發表於2024-10-30

本文原文來自:什麼是多型?物件導向中對多型的理解

什麼是多型

多型(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;
}

相關文章