类模板可以继承也可以被继承。 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++类模版的继承
最新推荐文章于 2025-03-10 16:06:31 发布