KoreanFoodie's Study
Effective C++ | 항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 본문
Tutorials/C++ : Advanced
Effective C++ | 항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자
GoldGiver 2022. 10. 25. 16:26
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!
항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자
핵심 :
public 상속의 의미는 "is-a(...는 ...의 일종)"이다. 기본 클래스에 적용되는 모든 것들이 파생 클래스에 그대로 적용되어야 한다. 왜냐하면 모든 파생 클래스 객체는 기본 클래스 객체의 일종이기 때문이다.
어떤 Base 클래스로부터 Derived 클래스가 public 상속을 받았다면, Derived 클래스는 Base 클래스보다 더 특수한 개념을 나타내게 된다. 사용처가 제한된다고 봐도 좋다.
public 상속이 신기한 이유는, 우리가 일반적으로 생각하고 있는 논리적인 개념과 충돌할 수 있기 때문이다. 예를 들어, 수학적으로는 직사각형이 정사각형을 포함하는 경우이므로 정사각형 클래스를 직사각형 클래스로부터 public 상속을 받게 사용할 수 있을 거라고 가정할 수 있다. 다음 코드를 보자.
class Rectangle
{
public:
virtual void setHeight(int newHeight);
virtual void setWidth(int newWidth);
virtual void height() const;
virtual void width() const;
...
};
// r 의 넓이를 늘리는 함수
void makeBigger(Rectangle& r)
{
int oldHeight = r.height();
r.setWidth(r.newWidth() + 10);
assert(r.height() == oldHeight);
}
class Square : public Rectangle
{
...
};
Square s;
// 높이와 너비가 달라서 단언문이 거짓!
makeBigger(s);
위의 코드처럼, Rectangle 에서 통하는 코드가 Squre 에서는 에러를 낼 수도 있다. 따라서 public 상속을 할 때는 객체 지향의 관점에서 설계를 제대로 할 필요가 있다!
'Tutorials > C++ : Advanced' 카테고리의 다른 글
Effective C++ | 항목 34 : 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 (0) | 2022.10.25 |
---|---|
Effective C++ | 항목 33 : 상속된 이름을 숨기는 일은 피하자 (0) | 2022.10.25 |
Effective C++ | 항목 31 : 파일 사이의 컴파일 의존성을 최대로 줄이자 (0) | 2022.10.25 |
Effective C++ | 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자 (0) | 2022.10.25 |
Effective C++ | 항목 29 : 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2022.10.25 |
Comments