我可以通过这种方式混合继承和模板吗? :
template <class T>
class AbstractType { // abstract
//....
}
template <class T>
class Type1 : public AbstractType<T> {
//....
}
之后,我可以像这样使用这些类:
AbstractType<SomeClass>* var1 = new Type1<SomeClass>();
寻求帮助。
答案 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。