객체 지향 프로그래밍이 제공하는 상속이라는 특징은 상속 그 자체로도 의미가 있지만 상속에 의해서 다형성이 제공된다는 점에서 그 의미가 큽니다.
클래스형 변환 규칙
클래스와 관련된 형 변환 규칙을 클래스형 변환 규칙이라고 합니다. 규칙들은 아래와 같습니다.
- 파생 클래스의 객체는 기본 클래스의 객체로 형 변환 가능하다.
- 파생 클래스의 포인터는 기본 클래스의 포인터로 형 변환 가능하다.
- 파생 클래스의 레퍼런스는 기본 클래스의 레퍼런스로 형 변환 가능하다.
클래스형 변환 규칙 중 객체 간의 형 변환은 자주 사용되지 않습니다. 주로 포인터 간의 형 변환이나 레퍼런스 간의 형 변환이 사용됩니다.
백문이 불여일견, 예를 통해서 알아보겠습니다.
도형과 사각형, 원의 관계를 예로 들겠습니다.
Rectangle과 Eclipse = Shape
Rectangle은 Shape를 상속받습니다.
Eclipse는 Shape를 상속받습니다.
- 이로 인해 두 Rectangle과 Eclipse는 공통으로 필요한 기능을 Shape 클래스에서 한번만 구현하고 있습니다.
- 같은 기능을 여러번 구현하지 않고 상속을 통해 한 번만 구현했습니다.
- Shape의 멤버 변수, 함수들인 m_start, m_end, SetStartPoint 등을 상속받음
- Rectangle, Eclipse의 객체 주소는 언제든지 기본 클래스 포인터인 Shape* 형으로 형 변환이 가능합니다.
+ 반대로는 형 변환이 안됩니다!
- Shape : 기본 클래스, Eclipse, Rectangle : 파생 클래스
이러한 관계를 'is-a' 관계라고 하며 Rectangle is a Shape 라고 이해하시면 되겠습니다.
파생 클래스는 기본 클래스의 모든 멤버를 상속 받고 추가로 다른 멤버를 제공합니다.
- 파생 클래스 객체를 기본 클래스 포인터로 접근할 경우 -> 파생 클래스가 가진 기능 중 기본 클래스로 부터 상속받은 기능에만 접근 가능
아래의 코드는 자세한 구현내용은 별 의미가 없고
기본 클래스인 Shape와 Eclipse, Rectangle이 어떤 연관 관계를 가지고 동작하는지를 위주로 보시면 되겠습니다.
Point 클래스와 Shape 클래스 선언
'Programming Language > C, C++' 카테고리의 다른 글
C++ 가상 함수 (virtual) - 동적 바인딩 (0) | 2014.11.07 |
---|---|
C++ 가상 함수 (virtual) - 기본 (0) | 2014.11.07 |
C++ Hash와 Map의 차이점 (0) | 2014.10.13 |
C++와 Java의 차이점 (0) | 2014.10.13 |
C++ STL (0) | 2014.10.10 |