是通用基类Legal
Is a Generic Base Class Legal?
这似乎有效,但我不能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
),您可以从中派生。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 是通用基类Legal