1. 程式人生 > 其它 >靜態多型和動態多型的區別

靜態多型和動態多型的區別

技術標籤:c++

#include <iostream>
using namespace std;

class A
{
public:
	virtual void function() { cout << "I am A" << endl; }
};

class B :public A
{
public:
	void function() { cout << "I used to be A but now I am B" << endl; }
	void functionB() { cout <<
"I am B" << endl; } }; class C :public A { public: void function() { cout << "I used to be A but now I am C" << endl; } void functionC() { cout << "I am C" << endl; } }; template<class T> void print1(T* temp) { temp->function
(); } void print2(A* temp) { temp->function(); } int main() { A* b = new B; A* c = new C; print1(b); print1(c); print2(b); print2(c); return 0; }

在這裡插入圖片描述
從上圖可以看出,模板虛擬函式都能實現多型,那麼這兩者到底有什麼區別呢?模板實現屬於靜態多型,而虛擬函式實現屬於動態多型,靜態多型是在編譯時完成的,動態多型是在程式執行時完成的。

靜態多型
優點:
1、由於靜多型是在編譯期完成的,因此效率較高,編譯器也可以進行優化;
2、有很強的適配性和鬆耦合性,比如可以通過偏特化、全特化來處理特殊型別;

3、最重要一點是靜態多型通過模板程式設計為C++帶來了泛型設計的概念,比如強大的STL庫。
缺點:
由於是模板來實現靜態多型,因此模板的不足也就是靜多型的劣勢,比如除錯困難、編譯耗時、程式碼膨脹、編譯器支援的相容性
不能夠處理異質物件集合

動態多型
優點:
1、OO設計,對是客觀世界的直覺認識;
2、實現與介面分離,可複用
3、處理同一繼承體系下異質物件集合的強大威力
缺點:
1、執行期繫結,導致一定程度的執行時開銷;
2、編譯器無法對虛擬函式進行優化
3、笨重的類繼承體系,對介面的修改影響整個類層次;

相同點:
1、都能夠實現多型性,靜態多型/編譯期多型、動態多型/執行期多型;
2、都能夠使介面和實現相分離,一個是模板定義介面,型別引數定義實現,一個是基類虛擬函式定義介面,繼承類負責實現;
不同點:
1、本質不同,靜態多型在編譯期決定,由模板具現完成,而動態多型在執行期決定,由繼承、虛擬函式實現;
2、動態多型中介面是顯式的,以函式簽名為中心,多型通過虛擬函式在執行期實現,靜態多臺中介面是隱式的,以有效表示式為中心,多型通過模板具現在編譯期完成