class Base { public: virtual void f() = 0; };
class Derived :public Base { virtual void f() override { } public: };若改為靜態多型可能會像以下這樣:
template<typename DERIVED> class Base { public: void f() { static_cast<DERIVED*>(this)->f_Imp(); } };
class Derived :public Base<Derived> { void f_Imp() { } public:
friend class Base<Derived>; };
將原本呼叫虛擬成員函數,變成呼叫一般成員函數,這樣子速度上會快上許多,這才叫 殺 很 大(借用郭書瑤的成名廣告詞)
但...且慢,若你想以後用靜態多型來代替動態多型,或想把以前寫的動態多型改為靜態多型,那你一定會碰一鼻子灰,因兩者是無法互相取代不相干的兩件事。
主要的差異是動態多型是用於 Base 這個使用角度,而靜態多型則用於 Derived 的使用角度,你無法用靜態多型的 Base 去宣告一個變數,一定要加上 Derived 類別,像這樣 Base<Derived>。
所以使用靜態多型就得先了解使用情境:
- 使用的角度須是 Derived
- 有兩個以上的 Derived 有共同功能,可以提出來做成 Base
- 若 Base 須要呼叫 Derived 的功能時就可以做成 靜態多型 了
沒有留言:
張貼留言