對於理解模板,它的巨大優勢獲得術語直,因爲你談論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