继承自c ++中的模板类
假设我们有一个模板类Area
,它具有成员变量T area
, T getArea()
和void setArea(T)
成员函数。
我可以通过键入Area<int>
来创建特定类型的Area
对象。
现在我有一个继承Area
类的Rectangle
类。 由于Rectangle
本身不是模板,因此我无法键入Rectangle<int>
。
我如何专门化Rectangle
对象的继承Area
类型?
编辑:对不起,我忘了澄清 - 我的问题是是否有可能继承区域没有专门化,所以它不是继承为区域的整数,但作为面积矩形可以专门化的类型。
为了理解模版,直接使用术语具有巨大的优势,因为您所讲的关于它们的方式决定了思考它们的方式。
具体而言, Area
不是模板类,而是类模板。 也就是说,它是可以从中生成类的模板。 Area<int>
就是这样一个类(它不是一个对象,但是你可以用同样的方法创建一个来自该类的对象,你可以从任何其他类创建对象)。 另一个这样的类将是Area<char>
。 请注意,这些是完全不同的类,除了它们是从同一个类模板生成的事实外,它们没有什么共同之处。
因为Area
不是一个类,所以你不能从它派生类Rectangle
。 你只能从另一个类(或其中的几个)中派生出一个类。 由于Area<int>
是一个类,因此可以从中派生出Rectangle
:
class Rectangle:
public Area<int>
{
// ...
};
由于Area<int>
和Area<char>
是不同的类,所以您甚至可以同时从两者中派生出来(但是,在访问它们的成员时,您必须处理不明确性):
class Rectangle:
public Area<int>,
public Area<char>
{
// ...
};
但是,您必须指定从定义Rectangle
时派生出哪些分类。 无论这些类是否是从模板生成的,都是如此。 相同类的两个对象根本不能有不同的继承层次结构。
你可以做的是把Rectangle
做成模板。 如果你写
template<typename T> class Rectangle:
public Area<T>
{
// ...
};
您有一个模板Rectangle
,您可以从中获取从Area<int>
派生的类Rectangle<int>
以及从Area<int>
Rectangle<char>
派生的不同类Rectangle<char>
Area<char>
。
它可能是你想要一个单一类型的Rectangle
这样你就可以将各种Rectangle
传递给同一个函数(它本身不需要知道Area类型)。 由于通过实例化模板Rectangle
生成的Rectangle<T>
类在形式上彼此独立,因此它不会以这种方式工作。 但是,您可以在这里使用多重继承:
class Rectangle // not inheriting from any Area type
{
// Area independent interface
};
template<typename T> class SpecificRectangle:
public Rectangle,
public Area<T>
{
// Area dependent stuff
};
void foo(Rectangle&); // A function which works with generic rectangles
int main()
{
SpecificRectangle<int> intrect;
foo(intrect);
SpecificRectangle<char> charrect;
foo(charrect);
}
如果您的泛型Rectangle
从泛型Area
派生出来很重要,那么您也可以使用与Area
相同的技巧:
class Area
{
// generic Area interface
};
class Rectangle:
public virtual Area // virtual because of "diamond inheritance"
{
// generic rectangle interface
};
template<typename T> class SpecificArea:
public virtual Area
{
// specific implementation of Area for type T
};
template<typename T> class SpecificRectangle:
public Rectangle, // maybe this should be virtual as well, in case the hierarchy is extended later
public SpecificArea<T> // no virtual inheritance needed here
{
// specific implementation of Rectangle for type T
};
你只是试图从Area<int>
派生? 在这种情况下,你这样做:
class Rectangle : public Area<int>
{
// ...
};
编辑:在澄清之后,看起来你实际上正在尝试使Rectangle
成为一个模板,在这种情况下,以下内容应该可以工作:
template <typename T>
class Rectangle : public Area<T>
{
// ...
};
class Rectangle : public Area<int> {
};
链接地址: http://www.djcxy.com/p/69065.html