通用基类是合法的吗?

时间:2012-02-16 18:53:29

标签: c++ templates inheritance

这似乎有效,但我不是百分之百确定这是合法的,并会感谢一些反馈。

我有一个派生自通用基类的子类。它类似于奇怪的重复模板模式,但不同。

在derived.h中:

template <class T>
class Derived : public T
{
public:
    Derived();
... and some other stuff ...
};

在derived.cpp中:

#include "derived.h"

template <class T>
Derived<T>::Derived()
{
    ...
}

// defining the variations I need here avoids linker errors
// see http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13
template Derived<Base1>::Derived();
template Derived<Base2>::Derived();

在其他文件中:

#include "derived.h"

void test()
{
    Derived<Base1> d1;
    Derived<Base2> d2;
    ... do stuff with d1 and d2 ...
}

2 个答案:

答案 0 :(得分:5)

是的,你可以从任何类派生,包括一个(或依赖于)模板参数的类。

如评论中所述,它必须是完整的类型;也就是说,它必须在模板实例化之前定义。

答案 1 :(得分:5)

在C ++中没有“泛型类”这样的东西。您拥有的是模板,模板不是类。相反,模板实例成为类。但是,这些是完全不同的,独立的和不相关的类,因此Derived<A>Derived<B>彼此无关。

除此之外,你所做的一切都很好。在任何给定的模板实例 Derived<T>中,T是一个实际的类(假设它 实际上是一个类,而不是一个数组或者int),你可以从中得到它。