C++類模版的繼承

類模板可以繼承也可以被繼承。

  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;//查找被延遲了

  }

  };

  如果使用修改方案二,如果原來的非受限非依賴型名稱是被用於虛函數調用的話,

  那麼引入依賴性的限定的話,那麼這種引入依賴性的限定將會近之虛函數調用,

  從而也會改變程序的含義,當遇到第二種情況不適合的情況,可以採用方案一
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章