[Basic C++] #55-5_템플릿 클래스의 파생 클래스, 템플릿 클래스 상속
C++의 템플릿 중 "템플릿 클래스 상속"에 대해 알아보겠습니다.
"전문가를 위한 C"의 11 항목, "템플릿을 이용한 제네릭 코드 작성"에 해당하는 내용입니다.
템플릿 클래스 상속
1. 인스턴스화 되지 않은 템플릿 원본 상속 ---> 템플릿 O
2. 인스턴스 상속 ---> 템플릿 X
인스턴스화되지 않은, 즉 원본 템플릿 클래스를 상속하는 하위 클래스는 항상 템플릿으로 작성해야 합니다.
반면에, 템플릿 클래스의 인스턴스를 상속하는 경우 하위 클래스는 템플릿일 필요가 없습니다.
// 템플릿 클래스(SuperClass)의 파생 클래스(SubClass) 정의
template<typename T>
class SubClass : public SuperClass<T>
{
public:
SubClass( size_t inWidth = SuperClass<T>::DefaultWidth, size_t Height = SuperClass<T>::DefaultHeight)
void Move( size_t srcX, size_t srcY, size_t destX, size_t destY );
};
기본적으로 우리가 알고 있는 클래스의 상속을 작성하는 방법과 크게 다르지 않습니다!
// SubClass의 멤버 메서드 정의부
template<typename T>
SubClass<T>::SubClass(size_t inWidth, size_t inHeight )
{
//...
}
template<typename T>
void SubClass<T>::Move(size_t srcX, size_t srcY, size_t destX, size_t destY)
{
//...
}
멤버 메서드의 정의 또한 비슷합니다!
템플릿 상속 vs 템플릿 특수화
상속 | 특수화 | |
코드 재사용? | O | X |
이름 재사용? | X | O |
다형성 지원? | O | X |
템플릿 상속과 템플릿 특수화의 차이점을 간단히 살펴보겠습니다.
1. 코드 재사용?
템플릿 상속의 경우 원본 템플릿 클래스의 모든 것을 상속받기 때문에, 코드를 재작성할 필요가 없습니다.
반면에, 템플릿 특수화의 경우 원본 템플릿 클래스의 모든 내용을 재작성해야 합니다!
2. 이름 재사용?
당연하게도, 템플릿 상속의 경우 파생 클래스와 베이스 클래스의 이름을 다르게 작성해야겠죠?
하지만, 템플릿 특수화의 경우 베이스 클래스와 같은 이름을 가지겠죠!
3. 다형성 지원?
템플릿 상속은 "is-a" 관계가 성립합니다.
템플릿 특수화는 앞선 포스팅에서 설명했듯이, 서로 "다른 타입"을 템플릿 매개변수로 가지는 템플릿 클래스 객체들은 서로 다른 타입입니다!
다형성 이용 -> 템플릿 상속
특정 타입에 대한 특수화 -> 템플릿 특수화
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #55-7_템플릿 변수 (0) | 2022.08.10 |
---|---|
[Basic C++] #55-6_함수 템플릿 (0) | 2022.08.04 |
[Basic C++] #55-4_템플릿 클래스의 특수화, 특정 타입에 대한 템플릿 클래스 (0) | 2022.07.28 |
[Basic C++] #55-3_템플릿 메서드, 이중 템플릿 (0) | 2022.07.27 |
[Basic C++] #55-2_템플릿 파라미터 (0) | 2022.07.27 |