您好,登錄后才能下訂單哦!
1.多態的概念與分類
多態(Polymorphisn)是面向對象程序設計(OOP)的一個重要特征。多態字面意思為多種狀態。在面向對象語言中,一個接口,多種實現即為多態。C++中的多態性具體體現在編譯和運行兩個階段。編譯時多態是靜態多態,在編譯時就可以確定使用的接口。運行時多態是動態多態,具體引用的接口在運行時才能確定。
靜態多態和動態多態的區別其實只是在什么時候將函數實現和函數調用關聯起來,是在編譯時期還是運行時期,即函數地址是早綁定還是晚綁定的。靜態多態是指在編譯期間就可以確定函數的調用地址,并生產代碼,這就是靜態的,也就是說地址是早綁定。靜態多態往往也被叫做靜態聯編。 動態多態則是指函數調用的地址不能在編譯器期間確定,需要在運行時確定,屬于晚綁定,動態多態往往也被叫做動態聯編。
2.多態的作用
為何要使用多態呢?封裝可以使得代碼模塊化,繼承可以擴展已存在的代碼,他們的目的都是為了代碼重用。而多態的目的則是為了接口重用。靜態多態,將同一個接口進行不同的實現,根據傳入不同的參數(個數或類型不同)調用不同的實現。動態多態,則不論傳遞過來的哪個類的對象,函數都能夠通過同一個接口調用到各自對象實現的方法。
3.靜態多態
靜態多態往往通過函數重載和模版(泛型編程)來實現,具體可見下面代碼:
#include <iostream> using namespace std; //兩個函數構成重載 int add(int a, int b) { cout<<"in add_int_int()"<<endl; return a + b; } double add(double a, double b) { cout<<"in add_double_doube()"<<endl; return a + b; } //函數模板(泛型編程) template <typename T> T add(T a, T b) { cout<<"in func tempalte"<<endl; return a + b; } int main() { cout<<add(1,1)<<endl; //調用int add(int a, int b) cout<<add(1.1,1.1)<<endl; //調用double add(double a, double b) cout<<add<char>('A',' ')<<endl; //調用模板函數,輸出小寫字母a }
程序輸出結果:
in add_int_int()
2
in add_double_doube()
2.2
in func tempalte
a
4.動態多態
動態多態最常見的用法就是聲明基類的指針,利用該指針指向任意一個子類對象,調用相應的虛函數,可以根據指向的子類的不同而調用不同的方法。如果沒有使用虛函數,即沒有利用C++多態性,則利用基類指針調用相應函數的時候,將總被限制在基類函數本身,而無法調用到子類中被重寫過的函數。因為沒有多態性,函數調用的地址將是一定的,而固定的地址將始終調用同一個函數,這就無法“實現一個接口,多種實現”的目的了。
#include <iostream> using namespace std; class Base { public: virtual void func() { cout << "Base::fun()" << endl; } }; class Derived : public Base { public: virtual void func() { cout << "Derived::fun()" << endl; } }; int main() { Base* b=new Derived; //使用基類指針指向派生類對象 b->func(); //動態綁定派生類成員函數func Base& rb=*(new Derived); //也可以使用引用指向派生類對象 rb.func(); }
程序輸出結果:
Derived::fun()
Derived::fun()
通過上面的例子可以看出,在使用基類指針或引用指向子類對象時,調用的函數是子類中重寫的函數,這樣就實現了運行時函數地址的動態綁定,即動態聯編。動態多態是通過“繼承+虛函數”來實現的,只有在程序運行期間(非編譯期)才能判斷所引用對象的實際類型,根據其實際類型調用相應的方法。具體格式就是使用virtual關鍵字修飾類的成員函數時,指明該函數為虛函數,并且派生類需要重新實現該成員函數,編譯器將實現動態綁定。
以上就是詳解C++ 多態的兩種形式(靜態、動態)的詳細內容,更多關于C++ 靜態多態和動態多態的資料請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。