상속
1. 상속의 개념
- 객체 지향 언어에서 말하는 상속은 부모의 유전자가 자식에게 물려지는 것과 같다
- 중복된 기능을 가진 여러 클래스들을 상속 관계로 설정하면 클래스를 간소화할 수 있다
- 상속은 클래스들을 계층적으로 분류하여 관리를 용이하게 한다
- 자식 클래스는 부모 클래스의 메소드와 멤버 변수들(private 접근 지정자 제외)을 상속 받는다.
- 상속은 부모 클래스의 재사용을 통해 소프트웨어 생산성을 향상시킨다
- 부모 클래스를 기본 클래스 (base class), 자식 클래스를 (derived class)라고 한다
2. 클래스 상속과 객체
- c++에서 파생 클래스(자식 클래스)는 다음과 같이 선언한다.
- 파생 클래스의 객체는 파생 클래스의 멤버와 기본 클래스의 멤버를 모두 가진다.
3. 상속과 객체 포인터
- 기본 클래스의 포인터로 파생 객체를 가리키는 것을 업 캐스팅이라고 한다
- 업 캐스팅된 포인터로 객체의 기본 클래스 멤버만 접근할 수 있다
- 파생 클래스의 포인터에 기본 클래스 타입의 주소가 치환되는 것을 다운 캐스팅이라고 한다
4. 상속과 생성자, 소멸자
- 파생 클래스의 생성자는 기본 클래스의 생성자를 먼저 호출한 후, 자신의 생성자 코드를 실행한다
- 기본 클래스의 생성자가 파생 클래스의 생성자보다 먼저 실행된다
- 파생 클래스의 소멸자는 자신이 먼저 실행한 후 기본 클래스의 소멸자를 호출한다 (즉, 파생 클래스의 소멸자 기본 클래스의 소멸자보다 먼저 실행된다)
- 파생 클래스 생성자에서 기본 클래스의 생성자를 명시하지 않으면, 컴파일러는 묵시적으로 기본 클래스의 기본 생성자를 호출하도록 컴파일한다
5. 상속의 종류
- 기본 클래스를 상속받을 때, public 상속, private 상속, 그리고 protected 상속이 있다
- public 상속은 기본 클래스에 선언된 접근 지정이 그대로 상속된다
- private 상속은 기본 클래스에 선언된 접근 지정이 모두 private 속성으로 변경되어 상속된다
- protected 상속은 기본 클래스에 선언된 접근 지정이 모두 protected 속성으로 변경되어 상속된다
6. 다중 상속
- C++는 다중 상속을 허용한다. 다음은 다중 상속 사례이다.
- 다중 상속을 받은 파생 클래스의 객체가 생성될 때, 기본 클래스의 멤버가 중복하여 공간을 차지하는 문제가 발생할 수 있다.
- 다눙 상속을 통한 멤버 중복 문제는 가상 상속을 통해 해결할 수 있다
가상상속은 virtual 키워드를 이용한 상속이며, 파생 클래스의 객체가 생성될 때 이미 공간을 할당 받은 기본 클래스의 멤버에 대해 공간을 할당하지 않도록 하는 지시이다.
기본 클래스를 가상 상속받는 경우는 C++ 표준 클래스 라이브러리에서도 종종 볼 수 있다. 대표적으로 ios 클래스를 istream과 ostream이 상속받고, iostream이 istream과 ostream을 다중 상속받는 경우이다. 이 경우에도 다음과 같이 virtual 키워드를 이용한 가상상속으로 문제를 해결한다.
'C++ > C++ 기본' 카테고리의 다른 글
템플릿과 표준 템플릿 라이브러리 (0) | 2019.06.30 |
---|---|
가상 함수와 추상 클래스 (0) | 2019.01.21 |
연산자 함수는 멤버 함수나 프렌드 함수 중 어떤 것이 바람직한가? (0) | 2019.01.01 |
C++ 프렌드 개념 (0) | 2018.08.02 |
static 멤버 (0) | 2018.07.31 |