CPP Templates 之 类模板的继承

类模板的继承

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

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

};

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

posted on 2009-11-12 16:46  ATAK  阅读(531)  评论(0编辑  收藏  举报

导航