객체 지향 프로그래밍이 제공하는 상속이라는 특징은 상속 그 자체로도 의미가 있지만 상속에 의해서 다형성이 제공된다는 점에서 그 의미가 큽니다.


클래스형 변환 규칙

클래스와 관련된 형 변환 규칙을 클래스형 변환 규칙이라고 합니다. 규칙들은 아래와 같습니다.

- 파생 클래스의 객체는 기본 클래스의 객체로 형 변환 가능하다.

- 파생 클래스의 포인터는 기본 클래스의 포인터로 형 변환 가능하다.

- 파생 클래스의 레퍼런스는 기본 클래스의 레퍼런스로 형 변환 가능하다.


클래스형 변환 규칙 중 객체 간의 형 변환은 자주 사용되지 않습니다. 주로 포인터 간의 형 변환이나 레퍼런스 간의 형 변환이 사용됩니다.


백문이 불여일견, 예를 통해서 알아보겠습니다.




도형과 사각형, 원의 관계를 예로 들겠습니다.

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 클래스 선언



Rectangle 클래스 선언

- Shape를 상속받음 (Rectangle과 Shape의 모든 기능을 가지고 있음)


Eclipse 클래스 선언

- Shape를 상속받음 (Eclipse와 Shape의 모든 기능을 가지고 있음)



메인 구현



추가로 클래스형 변환 규칙은 함수의 인자를 전달할 때에도 사용됩니다.


void f(Shape& s);

int main()

{

      Rectangle r1;

      f(r1);                                // Shape& s = r1;

      Eclipse e1;

      f(e1);                                // Shape& s = e1; 과 같은 의미

}


또한 기본 클래스의 포인터 배열을 이용해 파생 클래스들을 관리할 수 있습니다.


Shape *arr[MAX_SHAPE] = {NULL};

arr[0] = new Rectangle;

arr[1] = new Eclipse;

arr[2] = new Rectangle;           // 0, 1, 2번 배열에 각각 파생 클래스 관리

arr[0]->SetStartPoint(x, y);       // 이와 같은 연산이 똑같이 가능

'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
Posted by 긍정왕오킹