C ++模板和继承

时间:2010-09-24 13:07:35

标签: c++ templates inheritance

我可以通过这种方式混合继承和模板吗? :

template <class T> 
class AbstractType { // abstract
//....
}

template <class T> 
class Type1 : public AbstractType<T> {
//....
}

之后,我可以像这样使用这些类:

AbstractType<SomeClass>* var1 = new Type1<SomeClass>();

寻求帮助。

3 个答案:

答案 0 :(得分:7)

是的,你可以。您可以将模板参数用于任何您想要的内容,并传递给包含的基本模板化类。

答案 1 :(得分:6)

你可以,但它不会像你想象的那样有用。您可以像这样定义结构:

#include <string>
#include <vector>
using namespace std;

template<typename Val>
class Base
{
public:
    virtual Val DoIt() const = 0;
};

template<typename Val>
class Derived : public Base<Val>
{
public:
    Derived(const Val& val) : val_(val) {};
    Val DoIt() const { return val_; }
protected:
    Val val_;
};

int main()
{
    Derived<string> sd("my string");
    string sd_val = sd.DoIt();

    Derived<float> fd(42.0f);
    float fd_val = fd.DoIt();
}

但是当你定义抽象基类型时,你经常会想要它们的集合,并且能够通过基类指针调用以获得多态行为。如果您对基类进行模板化,那么您将无法执行此操作,因为模板参数的每个变体都将创建不同的类型。 Base<int>Base<string>完全不同,您不能只指向任何一个Base*

此代码无法编译:

vector<Base*> my_objs;

答案 2 :(得分:1)

如果类型与类定义

兼容,则可以将任何类型与类模板一起使用

e.g。

template<class T> struct S{
   T mt;
};

这样的结构可以实例化为T = int,T = double,但不是T = void。