發表文章

目前顯示的是 9月, 2009的文章

C++的靜態多型

class Foo : public Base<Foo> { }; 在上例中,類別Foo繼承自類別Base,類別Base有一個Template參數,而在此例中是以類別Foo作為參數傳入。以上這個宣告是合法的,根據C++的標準規格,當類別Foo宣告之後,Foo這個名字就算是已被定義了,所以能夠立即被拿來餵給類別Base作為參數使用。 template<class T> class B { public: void sayHello() { T* pThis = static_cast<T*>(this); pThis->hello(); } // 可被子類別覆寫(overridable) void hello() { cout << "B::hello" << endl; } }; class D1 : public B<D1> { }; class D2 : public B<D2> { public: void hello() { cout << "D2::hello" << endl; } }; int main() { D1 d1; D2 d2; d1.sayHello(); // 印出 "B::hello" d2.sayHello(); // 印出 "D2::hello" return 0; } 在上面的範例中我們宣告了一個類別B,還有二個繼承類別B的類別D1和類別D2。類別D1和類別D2以上面所提到的方式,以自己為參數繼承template類別B。類別B中有個sayHello公開函式,它會呼叫一個叫作hello的函式。hello函式在類別B中有一個預設的實作,會在畫面上列印出"B::hello"的文字訊息,而這個函式hello可以被子類別所覆寫。如果子類別有覆寫hello函式實作自己的版本,則在呼叫sayHello時子類別的實作就會被呼叫到,否則就會呼叫到預設的類別B的版本。 這裡使用到的關鍵技巧就在於static_cast<T*>(this)這