[C++] 상속 (Inheritance)
Language/C++- 상속의 기본 개념
현실 세계에서 부모의 재산을 물려받는 상속과 비슷하게 객체지향에서의 상속은 다른 클래스의 모든 멤버를 물려 받아 지니고 있게 되는 것을 말한다.
이때 상속되는 클래스를 'Base 클래스' 라고 하며, 상속하는 클래스를 'Derived' 클래스라한다. 다른 표현으로 다른 표현으로 부모 클래스와 자식 클래스 혹은 Super 클래스와 Sub 클래스 라고도 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class AAA { public: void funcA() { cout << "AAA" << endl; } }; class BBB : public AAA { public: void funcB() { funcA(); cout << "BBB" << endl; } }; |
위 코드에서 7번째 줄을 보면 콜론(:)을 이용하여 BBB 클래스가 AAA클래스를 public 상속한 것을 볼 수 있다.
따라서 AAA 클래스의 멤버 함수인 funcA를 BBB클래스에서 자유롭게 쓰고 있는 것을 볼 수 있다.
- 상속하는 클래스의 객체 생성 및 소멸 순서
객체의 생성과 소멸순서를 알아보기 위해 다음과 같이 출력을 해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class AAA { public: AAA() { cout << "AAA Constructor" << endl; } ~AAA() { cout << "AAA Destructor" << endl; } }; class BBB : public AAA { public: BBB() { cout << "BBB Constructor" << endl; } ~BBB() { cout << "BBB Destructor" << endl; } }; |
위와 같이 생성자는 Base 클래스가 먼저 출력되고 소멸자는 반대로 출력되는 것을 볼 수 있다.
소멸자는 반대로 호출되는 이유는 메모리의 완벽한 해제를 위해서이다.
여기서 중요한것은 생성자가 호출되는 과정인데, 출력만 보면 AAA 클래스의 생성자가 먼저 호출되고 BBB 클래스의 생성자가 호출되는 것 같지만, 사실은 그 반대다.
BBB 클래스의 생성자가 먼저 호출되고 몸체부분은 실행되지 않는다. 다음으로 AAA 클래스의 생성자가 실행되고 나서야 BBB의 몸체부분이 실행되는 것이다.
이걸 제대로 이해한다면 멤버 이니셜라이저(member initializer)를 이용하여 Base 클래스에서 인자가 존재하는 생성자를 올바르게 초기화 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class AAA { int valA; public: AAA(int _val) { valA = _val; } }; class BBB : public AAA { public: BBB(int _val) : AAA(_val) {} }; |
12번째 줄에서 멤버 이니셜라이저를 통해 AAA 클래스의 인자가 있는 생성자를 호출하였다.
- public, protected, private 상속
기본적으로 public 상속을 많이 사용하지만 세가지 형태의 상속이 존재한다.
이 상속 형태에 따라 Base 클래스의 멤버가 Derived 클래스로 상속되는 과정에서 접근 권한이 변경된다.
상속되는 과정에 따른 접근 권한 변경은 아래와 같다.
'Language > C++' 카테고리의 다른 글
[C++] 객체 포인터 (0) | 2015.12.22 |
---|---|
[C++] 상속의 조건. is-a 와 has-a (0) | 2015.12.19 |
[C++] mutable 키워드 (0) | 2015.12.03 |
[C++] explicit 키워드 (0) | 2015.12.02 |
[C++] static 키워드 (0) | 2015.12.02 |