컴퓨터공학/C++

[C++] 상속성

Pyxis 2024. 8. 21. 06:09

[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