天天看點

為什麼C++的member function template不能是virtual的

– 為什麼C++的member function template不能是virtual的

問題的意思是,為什麼在C++裡面,一個類的成員函數不能既是 template 又是 virtual 的。比如,下面的代碼是不合法的:

class Animal{
  public:
      template<typename T>
      virtual void make_sound(){
        //...
      }
};      
  • 從Unix/C開始,一個C/C++程式就可以被分開編譯,然後用一個linker連結起來。這種模型有一個問題,就是各個編譯單元可能對另一個編譯單元一無所知。
  • 一個 function template最後到底會被 instantiate

    為多少個函數,要等整個程式(所有的編譯單元)全部被編譯完成才知道。

  • 同時,virtual

    function的實作大多利用了一個"虛函數表"的東西,這種實作中,一個類的記憶體布局(或者說虛函數表的記憶體布局)需要在這個類編譯完成的時候就被完全确定。