[6-4]
객체지향의 3대 속성
- 상속성
- 은닉성
- 다형성
class에서 공통적인 속성과 기능들을 재사용할 수 없을까 ?
상속 (Inheritance) : 부모 → 자식에게 유산을 물려주는 것
Player의 int형 멤버변수가 3개,
Player를 상속받는 Knight의 int형 멤버변수가 1개 있다면
메모리 상황은 다음과 같이 된다.
(메모리)
[ [ Player ] ] : 4 * 3 Bytes (3개)
[ Knight ] : 4 * 1 Bytes (1개)
상속받은 Knight의 경우 부모인 Player의 멤버변수 3개에 자신의 멤버변수 1개가 추가되어
총 16Bytes가 메모리에 순차적으로 잡혀있다.
상속에서 생성자(N)와 소멸자(1)
생성자는 탄생을 기념해서 호출되는 함수인데,
Knight를 생성하면 Player의 생성자가 호출될까, Knight의 생성자가 호출될까?
둘 다 호출 된다 !
Knight가 Player를 상속받게 만들어 놨으면, Player가 들고 있던 함수들은 기본적으로 똑같이 물려받아 가지고 사용을 한다고 했는데, 다만 예외적으로 생성자와 소멸자같은 경우에는 물려주는 개념이 아님.
호출 결과 :
Player() 기본 생성자 호출
Knight() 기본 생성자 호출
~Knight() 소멸자 호출
~Player() 소멸자 호출
호출순서는 필수적으로 알아놔야 한다.
"부모님이 먼저 만들어지고, 그 다음에 내가 탄생하는거고 소멸될 때는 거꾸로 내가 먼저 소멸되고 부모님을 소멸시킨다"
그런데 엄밀하게 말해서, 위 순서가 정확하게 맞지는 않음
Knight()
/* 선처리 영역
여기서 Player() 생성자를 호출 */
{
_stamina = 100;
cout << "Knight() 기본 생성자 호출" << "\n";
}
low-level detail : (어셈블리 코드 기준)
Knight의 생성자를 먼저 호출하고, Knight의 생성자가 실행되기 직전에 선처리 영역에서 Player의 생성자를 호출
Knight의 소멸자를 먼저 호출하고 실행하고 난 뒤, 후처리 영역에서 Player의 소멸자를 호출 (이건 동일)
건축학적으로 생각해보면, 부모부터 바닥에서 쌓은 다음에, 자식을 쌓음
반대로 해체할 땐 위에서부터 해체해야하니 자식먼저 소멸, 그 다음 부모 소멸
Knight(int stamina) {}를 호출했을 때,
Player의 생성자는 그대로 기본 생성자가 호출된다.
하지만 부모의 생성자를 바꿔서 호출하고 싶다면?
Knight(int stamina) : Player(100)
/* 선처리 영역
여기서 Player(int hp) 생성자를 호출
*/
{
_stamina = stamina;
cout << "Knight() 기본 생성자 호출" << "\n";
}
'컴퓨터공학 > C++' 카테고리의 다른 글
[Modern C++] std::forward (0) | 2024.09.14 |
---|---|
[Modern C++] Lambda (0) | 2024.09.11 |
[C++] 동적할당 (0) | 2024.08.23 |
[C++] 초기화 리스트 (0) | 2024.08.22 |
[C++] 생성자와 소멸자 (0) | 2024.08.20 |