1. 程式人生 > 其它 >靜態聯編和動態聯編即多型的概念

靜態聯編和動態聯編即多型的概念

多型分類

  • 靜態多型 函式過載
  • 動態多型 虛擬函式 繼承關係

c++支援編譯時多型(靜態多型)和執行時多型(動態多型),運算子過載和函式過載就是編譯時多型,而派生類和虛擬函式實現執行時多型。

靜態多型和動態多型的區別就是函式地址是早繫結(靜態聯編)還是晚繫結(動態聯編)。如果函式的呼叫,在編譯階段就可以確定函式的呼叫地址,併產生程式碼,就是靜態多型(編譯時多型),就是說地址是早繫結的。而如果函式的呼叫地址不能編譯不能在編譯期間確定,而需要在執行時才能決定,這這就屬於晚繫結(動態多型,執行時多型)。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using
namespace std; class Animal { public: virtual void speak() { cout << "動物在叫" << endl; } }; class Cat :public Animal { public: void speak() { cout << "喵喵。。。" << endl; } }; //呼叫doSpeak, speak函式的地址早就繫結好了, 早繫結(即 靜態聯編:編譯階段就確定好了地址) //如果想呼叫貓的speak, 不能提前繫結好函式的地址了,所以需要在執行時再去確定函式地址
//動態聯編: 寫法 doSpeak繫結的方法改為虛擬函式 在父類上宣告虛擬函式, 發生了多型 //多型概念:父類的引用或者指標指向子類物件 void doSpeak(Animal& animal) { animal.speak(); } //如果發生了繼承關係,編譯器允許進行型別轉換 void test01() { Cat cat; doSpeak(cat); } int main() { test01(); system("Pause"); return 0; }

結果: