又稱編譯期多型,即在系統編譯期間就可以確定程式將要執行哪個函式。例如:函式過載,通過類成員運算子指定的運算。
函式過載示例:
class a
a( int x ) {}
void f() {}
void f( int x ) {}
};class b
void f() {}
void f( int x ) {}
};
以上,類a中兩個a()是函式過載,兩個f()是函式過載,類b同理。
動態多型是利用虛函式實現執行時的多型,即在系統編譯的時候並不知道程式將要呼叫哪乙個函式,只有在執行到這裡的時候才能確定接下來會跳轉到哪乙個函式。
動態多型是在虛函式的基礎上實現的,而實現的條件有:
(1) 在類中宣告為虛函式
(2) 函式的函式名,返回值,函式引數個數,引數型別,全都與基類的所宣告的虛函式相同(否則是函式過載的條件)
(3) 將子類物件的指標(或以引用形式)賦值給父類物件的指標(或引用),再用該指向父類物件的指標(或引用)呼叫虛函式
如此,便可以實現動態多型,程式會按照實際物件型別來選擇要實行的函式具體時哪乙個。
(1) 非多型
#include
using
namespace
std;
class a
void f()
};class b : public a
void f()
};int main()
執行結果a::f() is called.
a::f() is called.
在這種情況下,我們會發現程式的輸出結果並不是我們想要的,而是兩次呼叫的f()函式都是基類的。這是因為使用的是基類指標,而且基類中沒有將f()宣告為虛函式,所以每次呼叫都會使用基類的方法。
(2)多型
#include
using
namespace
std;
class a
virtual
void f()
};class b : public a
virtual
void f()
};int main()
執行結果a::f() is called.
b::f() is called.
這樣,也就實現了動態多型,程式可以按照我們期望的方式正確輸出。
建議在基類中,如果含有虛函式,就將類的析構函式宣告為虛析構函式,以避免在呼叫時發生錯誤。
C 多型 靜態多型與動態多型
多型 顧名思義,多型就是多種形態,也就是對不同物件傳送同乙個訊息,不同物件會做出不同的響應。並且多型分為靜態多型和動態多型。靜態多型就是在系統編譯期間就可以確定程式執行到這裡將要執行哪個函式,例如 函式的過載,物件名加點操作符執行成員函式等,都是靜態多型,其中,過載是在形成符號表的時候,對函式名做了...
C 靜態多型與動態多型
多型按字面的意思就是多種形態,相同的方法呼叫,但是有不同的實現方式。多型性可以簡單地概括為 乙個介面,多種方法 c 有兩種多型形式 靜態多型 也稱為編譯期間的多型,編譯器在編譯期間完成的,編譯器根據函式實參的型別 可能會進行隱式型別轉換 可推斷出要呼叫那個函式,如果有對應的函式就呼叫該函式,否則出現...
C 動態多型與靜態多型
c 中有兩種多型 動多型 執行期多型 和靜多型 編譯期多型 而靜多型主要通過模板來實現,巨集也是實現靜多型的一種途徑。模板不採用虛函式機制,所以所有呼叫在編譯期就可確定,因此它是靜態的。基於繼承和虛函式,多型的設計思想主要在於 對於幾個相關物件的型別,確定它們之間的乙個共同功能集 然後在基類中,把這...