通用基类是合法的吗?

cri*_*ell 4 c++ inheritance templates

这似乎有效,但我不是100%肯定它是合法的,并会欣赏一些反馈.

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

在derived.h中:

template <class T>
class Derived : public T
{
public:
    Derived();
... and some other stuff ...
};
Run Code Online (Sandbox Code Playgroud)

在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();
Run Code Online (Sandbox Code Playgroud)

在其他一些文件中:

#include "derived.h"

void test()
{
    Derived<Base1> d1;
    Derived<Base2> d2;
    ... do stuff with d1 and d2 ...
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 5

是的,您可以从任何类派生,包括(或依赖于)模板参数的类.

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


Ker*_* SB 5

在C++中没有"泛型类"这样的东西.你拥有的是一个模板,一个模板不是一个类.相反,模板的实例成为类.然而,那些是完全不同的,独立的和不相关的类,所以Derived<A>并且Derived<B>彼此无关.

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