C++中多態的概念和意義


C++多態性:

1. 定義

“一個接口,多種方法”,程序在運行時才決定調用的函數。

2. 實現:

C++多態性主要是通過虛函數實現的,虛函數允許子類重寫override(注意和overload的區別,overload是重載,是允許同名函數的表現,這些函數參數列表/類型不同)。

*多態與非多態的實質區別就是函數地址是早綁定還是晚綁定。

*如果函數的調用,在編譯器編譯期間就可以確定函數的調用地址,並生產代碼,是靜態的,就是說地址是早綁定的。

*而如果函數調用的地址不能在編譯器期間確定,需要在運行時才確定,這就屬於晚綁定。 

3.目的:

接口重用。封裝可以使得代碼模塊化,繼承可以擴展已存在的代碼,他們的目的都是為了代碼重用。而多態的目的則是為了接口重用。
4.用法:

聲明基類的指針,利用該指針指向任意一個子類對象,調用相應的虛函數,可以根據指向的子類的不同而實現不同的方法。

 

 

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void print()  // 這個函數可能被繼承的子類重寫,所以加上virtual 關鍵字來修飾它,稱為虛函數,實現多態;
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()  // 雖然沒有寫 virtual 關鍵字,但是由於繼承的關系,它就是虛函數;一般工程中沒必要在子類中寫 virtual;
    {
        cout << "I'm Child." << endl;
    }
};

void how_to_print(Parent* p)
{
    p->print();     // 希望展現多態行為;
}

int main()
{
    Parent p;
    Child c;

    how_to_print(&p);    // 期望打印: I'm Parent.  實際打印:I'm Parent.
    how_to_print(&c);    // 期望打印: I'm Child.  實際打印:I'm Child.

    return 0;
}

 

多態意義:

1,在程序運行過程中展現出動態的特性;

1,編譯時無法決定究竟調用哪一個版本的實現;

2,函數重寫必須多態實現,否則沒有意義;

1, C++ 后續語言(Java、C#)中,只要是重寫,一定是虛函數,不需要顯示聲明 virtual 關鍵字;

3,多態是面向對象組件化程序設計的基礎特性;

1,后續學習中多態特性會被變着花樣玩兒,特別是設計模式中絕大多數模式都和多態相關;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM