類模板可以繼承也可以被繼承。 1.在一個類模板中,一個非依賴型基類是指:無須知道模板實參就可以完全確定類型的 基類。 例如: template<typename X> class Base{ public: int basefield; typedef int T; }; class D1:public Base<Base<void> >{//實際上不是模板 public: void f(){basefield = 3; } }; template<typename T> class D2:public Base<double>{ public: void f() { basefield = 7; }//正常訪問繼承成員 T strange;//T是Base<double>::T,而不是模板參數 }; 注意事項:對於模板中的非依賴類型而言,如果在他的派生類中查找一個非受限名稱, 那就會先查找這個非依賴型基類,然後纔會查找模板參數列表。 2.非依賴性名稱不會在依賴基類中查找 template<typename X> class Base{ public: int basefield; typedef int T; }; template <typename T> class DD:Base<T>{ public: void f(){ basefield = 0;//problem } }; template<> class Base<bool>{ public: enum { basefield = 42 };//tricky }; void g(DD<bool>& d){ d.f();//opps } //修改方案一 template <typename T> class DD1:Base<T>{ public: void f(){ this->basefield=0;//查找被延遲了 } }; //修改方案二 template <typename T> class DD2:Base<T>{ public: void f(){ Base<T>::basefield=0;//查找被延遲了 } }; 如果使用修改方案二,如果原來的非受限非依賴型名稱是被用於虛函數調用的話, 那麼引入依賴性的限定的話,那麼這種引入依賴性的限定將會近之虛函數調用, 從而也會改變程序的含義,當遇到第二種情況不適合的情況,可以採用方案一
C++類模版的繼承
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.