C++/C++ 기본

c++ 상속

검정비니 2019. 1. 9. 16:01
728x90
반응형

상속


1. 상속의 개념


- 객체 지향 언어에서 말하는 상속은 부모의 유전자가 자식에게 물려지는 것과 같다


- 중복된 기능을 가진 여러 클래스들을 상속 관계로 설정하면 클래스를 간소화할 수 있다


- 상속은 클래스들을 계층적으로 분류하여 관리를 용이하게 한다


- 자식 클래스는 부모 클래스의 메소드와 멤버 변수들(private 접근 지정자 제외)을 상속 받는다.


- 상속은 부모 클래스의 재사용을 통해 소프트웨어 생산성을 향상시킨다


- 부모 클래스를 기본 클래스 (base class), 자식 클래스를 (derived class)라고 한다





2. 클래스 상속과 객체



c++에서 파생 클래스(자식 클래스)는 다음과 같이 선언한다.


class Derived : public Base {
// Base 클래스를 상속받는 Derived 클래스
};


- 파생 클래스의 객체는 파생 클래스의 멤버와 기본 클래스의 멤버를 모두 가진다.





3. 상속과 객체 포인터


- 기본 클래스의 포인터로 파생 객체를 가리키는 것을 업 캐스팅이라고 한다


- 업 캐스팅된 포인터로 객체의 기본 클래스 멤버만 접근할 수 있다


- 파생 클래스의 포인터에 기본 클래스 타입의 주소가 치환되는 것을 다운 캐스팅이라고 한다





4. 상속과 생성자, 소멸자


- 파생 클래스의 생성자는 기본 클래스의 생성자를 먼저 호출한 후, 자신의 생성자 코드를 실행한다


- 기본 클래스의 생성자가 파생 클래스의 생성자보다 먼저 실행된다


- 파생 클래스의 소멸자는 자신이 먼저 실행한 후 기본 클래스의 소멸자를 호출한다 (즉, 파생 클래스의 소멸자 기본 클래스의 소멸자보다 먼저 실행된다)


- 파생 클래스 생성자에서 기본 클래스의 생성자를 명시하지 않으면, 컴파일러는 묵시적으로 기본 클래스의 기본 생성자를 호출하도록 컴파일한다


B(int x) : A(x+3) {
// 부모 클래스 A의 생성자 중 하나를 명시적으로 호출
}





5. 상속의 종류


- 기본 클래스를 상속받을 때, public 상속, private 상속, 그리고 protected 상속이 있다


- public 상속은 기본 클래스에 선언된 접근 지정이 그대로 상속된다


private 상속은 기본 클래스에 선언된 접근 지정이 모두 private 속성으로 변경되어 상속된다


protected 상속은 기본 클래스에 선언된 접근 지정이 모두 protected 속성으로 변경되어 상속된다





6. 다중 상속


- C++는 다중 상속을 허용한다. 다음은 다중 상속 사례이다.


class MusicPhone : public MP3, public MobilePhone {
//MP3 클래스와 MobilePhone 클래스를 다중 상속
};



- 다중 상속을 받은 파생 클래스의 객체가 생성될 때, 기본 클래스의 멤버가 중복하여 공간을 차지하는 문제가 발생할 수 있다.


- 다눙 상속을 통한 멤버 중복 문제는 가상 상속을 통해 해결할 수 있다




가상상속은 virtual 키워드를 이용한 상속이며, 파생 클래스의 객체가 생성될 때 이미 공간을 할당 받은 기본 클래스의 멤버에 대해 공간을 할당하지 않도록 하는 지시이다.


기본 클래스를 가상 상속받는 경우는 C++ 표준 클래스 라이브러리에서도 종종 볼 수 있다. 대표적으로 ios 클래스를 istream과 ostream이 상속받고, iostream이 istream과 ostream을 다중 상속받는 경우이다. 이 경우에도 다음과 같이 virtual 키워드를 이용한 가상상속으로 문제를 해결한다.


class istream : virtual public ios { ... };
class ostream : virtual public ios { ... };
class iostream : public istream, public ostream { ... };


반응형