C++编程实例:CPPTemplates之类模板的继承
来源:优易学  2011-11-13 17:00:06   【优易学:中国教育考试门户网】   资料下载   IT书店

  类模板可以继承也可以被继承。

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

  }

  };

  如果使用修改方案二,如果原来的非受限非依赖型名称是被用于虚函数调用的话,那么引入依赖性的限定的话,那么这种引入依赖性的限定将会近之虚函数调用,从而也会改变程序的含义,当遇到第二种情况不适合的情况,可以采用方案一

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训