類模板的繼承
類模板可以繼承也可以被繼承。
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;//尋找被延遲了
}
};
如果使用修改方案二,如果原來的非受限非依賴型名稱是被用於虛函數調用的話,
那麼引入依賴性的限定的話,那麼這種引入依賴性的限定將會近之虛函數調用,
從而也會改變程式的含義,當遇到第二種情況不適合的情況,可以採用方案一