ATL---style模板

以下爲MFC程序員的WTL指南(2)中部分內容,對此表示對作者和譯者的感謝!

ATL-style 模板   

即使你能夠毫不費力地閱讀C++的模板類代碼,仍然有兩件事可能會使你有些頭暈,以下面這個類的定義爲例:

  

這樣作是合法的,因爲C++的語法解釋說即使CMyWnd類只是被部分定義,類名CMyWnd已經被列入遞歸繼承列表,是可以使用的。將類名作爲模板類的參數是因爲ATL要做另一件詭祕的事情,那就是編譯期間的虛函數調用機制。  

    如果你想要了解它是如何工作地,請看下面的例子:

這句代碼static_cast(this) 就是竅門所在。它根據函數調用時的特殊處理將指向B1類型的指針this指派爲D1或D2類型的指針,因爲模板代碼是在編譯其間生成的,所以只要編譯器生成正確的繼承列表,這樣指派就是安全的。(如果你寫成:class D3 : public B1<D2>

  就會有麻煩) 之所以安全是因爲this對象只可能是指向D1或D2(在某些情況下)類型的對象,不會是其他的東西。注意這很像C++的多態性(polymorphism),只是SayHi()方法不是虛函數。

  要解釋這是如何工作的,首先看對每個SayHi()函數的調用,在第一個函數調用,對象B1被指派爲D1,所以代碼被解釋成:

  由於D1沒有重載PrintClassName(),所以查看基類B1,B1有PrintClassName(),所以B1的PrintClassName()被調用。

  現在看第二個函數調用SayHi(),這一次對象被指派爲D2類型,SayHi()被解釋成:

  這一次,D2含有PrintClassName()方法,所以D2的PrintClassName()方法被調用。

  這種技術的有利之處在於:

  • 不需要使用指向對象的指針。
  • 節省內存,因爲不需要虛函數表。
  • 因爲沒有虛函數表所以不會發生在運行時調用空指針指向的虛函數。
  • 所有的函數調用在編譯時確定(譯者加:區別於C++的虛函數機制使用的動態編連),有利於編譯程序對代碼的優化。
發佈了45 篇原創文章 · 獲贊 3 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章