是通用基类Legal

Is a Generic Base Class Legal?

本文关键字:Legal 基类      更新时间:2023-10-16

这似乎有效,但我不能100%确定它是否合法,并希望得到一些反馈。

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

In衍生.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 ...
}

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

正如评论中所指出的,它必须是一个完整的类型;也就是说,必须在实例化模板之前对其进行定义。

在C++中没有"泛型类"这回事。您所拥有的是模板,而模板不是类。相反,模板实例变成类。然而,它们是完全不同的、独立的、不相关的类,因此Derived<A>Derived<B>彼此无关。

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