2017年12月26日 星期二

靜態多型

相對於靜態多型就是一般較多使用的的動態多型,如:
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>。

所以使用靜態多型就得先了解使用情境:
  1. 使用的角度須是 Derived
  2. 有兩個以上的 Derived 有共同功能,可以提出來做成 Base
  3. 若 Base 須要呼叫 Derived 的功能時就可以做成 靜態多型 了



沒有留言:

張貼留言