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 的功能時就可以做成 靜態多型 了
沒有留言:
張貼留言