对于理解模板,它的巨大优势获得术语直,因为你谈论t时的方式下摆决定了思考他们的方式。
具体而言,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
从中可以得到一个类Rectangle<int>
从Area<int>
派生,而不同的类Rectangle<char>
从Area<char>
派生。
它可能是你想要一个单一的类型Rectangle
,以便您可以将各种各样的Rectangle
传递给相同的功能(本身不需要知道面积类型)。由于通过实例化模板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
};
它是_class template_,因为它是从中生成类的模板。 – sbi 2012-01-10 20:48:47