템플릿을 이해하는 데있어 용어에 대해 말하는 방식에 따라 생각하는 방식이 결정되기 때문에 용어를 바로 잡는 것이 큰 이점입니다.
구체적으로 특별히, 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(자체가 Area 유형을 알 필요가 없음). 이후Rectangle<T> 템플릿을 인스턴스화하여 생성 된 클래스가 Rectangle서로 공식적으로 독립, 그것은 그런 식으로 작동하지 않습니다. 그러나 여기에서 다중 상속을 사용할 수 있습니다.
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
};