靜態多型和動態多型的區別
阿新 • • 發佈:2021-01-11
技術標籤: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、有很強的適配性和鬆耦合性,比如可以通過偏特化、全特化來處理特殊型別;
缺點:
由於是模板來實現靜態多型,因此模板的不足也就是靜多型的劣勢,比如除錯困難、編譯耗時、程式碼膨脹、編譯器支援的相容性
不能夠處理異質物件集合
動態多型
優點:
1、OO設計,對是客觀世界的直覺認識;
2、實現與介面分離,可複用
3、處理同一繼承體系下異質物件集合的強大威力
缺點:
1、執行期繫結,導致一定程度的執行時開銷;
2、編譯器無法對虛擬函式進行優化
3、笨重的類繼承體系,對介面的修改影響整個類層次;
相同點:
1、都能夠實現多型性,靜態多型/編譯期多型、動態多型/執行期多型;
2、都能夠使介面和實現相分離,一個是模板定義介面,型別引數定義實現,一個是基類虛擬函式定義介面,繼承類負責實現;
不同點:
1、本質不同,靜態多型在編譯期決定,由模板具現完成,而動態多型在執行期決定,由繼承、虛擬函式實現;
2、動態多型中介面是顯式的,以函式簽名為中心,多型通過虛擬函式在執行期實現,靜態多臺中介面是隱式的,以有效表示式為中心,多型通過模板具現在編譯期完成