다중 상속 Multiple Inheritance란?
지금까지는 Base Class가 1개인, Linear 상속 함수만을 다뤘다.
Base Class를 사자와 호랑이 두 개를 만들고
두 클래스를 모두 상속 받게 되면 사자와 호랑이의 혼종인 라이거 클래스를 만들 수 있는 것이 바로 다중 상속이다.
Lion, Tiger base class 를 만들고 두 개를 동시에 상속받아서
Liger derived class를 만들어 보자.
1) 컨스트럭터와 디스트럭터의 실행 순서는?
만약 다중상속 받을 때 상속의 순서에서 Tiger를 만저 써주게 되면 컨스트럭터의 순서도 바뀌게 된다.
2) 다중 상속시 오브젝트의 사이즈
각각 speak() 함수를 만들고 실행해보면
각각에 맞는 컨스트럭터가 불려진 후에
Liger! 외치게 된다.
이 때 sizeof(Liger)를 통해 Liger 사이즈를 보면 40 byte가 나온다.
그 이유는,
LionVTable*, lionData, Tiger VTable*, tigerData, ligerData 각각 8바이트이므로
모두 합쳐져서 40 바이트의 크기를 갖는 오브젝트 Liger가 된 것.
이렇게 되면, 각각에 맞는 Lion VT, Tiger VT, Liger VT이 만들어 질 것이고
각각에 맞는 speak(), 디스트럭터의 포인터들이 저장되어 있다.
3) 각각의 base class의 *를 사용해서 다중 상속받은 파생 클래스 할당
(1) Lion* 를 사용해서 Liger를 생성해 보자.
라이언의 포인터를 가지고 있는 polyLion은 위 (그림1)에서 Lion object에 해당되는 스코프만 가지므로 파란색 부분만 볼 수 있다. 그렇지만 이 포인터에 라이거를 할당시켰기 때문에 총 40 byte의 크기를 갖는 Liger 오브젝트가 만들어 지는데,
이 Liger의 VTable* 는 Liger VTable을 가리키게 된다.
(2) 위와 마찬가지로 Lion* 대신 Tiger*를 사용해서 Liger를 만들어 보면,
마찬가지로 Tiger의 포인터를 가지고있는 polyTiger는 위 (그림1)에서 초록색 부분,
즉 Tiger object에 해당하는 부분만 볼 수가 있다.
하지만 VTable*는 Liger의 VTable을 가리키게 되기 때문에 speak()를 실행했을 때 Liger! 라고 외치게 되는 것이다.
(3) Liger*를 사용해서 Liger 생성
이 때 Liger의 포인터 ligerPtr는 (그림1)에서 liger object에 해당하는 오브젝트 전부를 볼 수 있는 스코프를 가지고 있기 때문에 전부를 볼 수 있다.
Liger object는 2개의 *VTable 을 가지고 있는데 둘 모두 Liger VTable을 가리키고 있는 것이다.
+ 다이아몬드 상속
Lion Tiger base 클래스를 만들고 두개를 상속받아서 Liger 클래스를 만들었다.
이 때, 사자와 호랑이는 둘 모두 동물이니까 사자와 호랑이 모두 Animal class 를 상속받을 수 있다.
Liger object를 만들기 위해서 Animal 생성자가 2번 불려진 것을 확인할 수 있다.
Animal 생성자를 1번만 생성하기 위해서는 virtual 상속 개념을 사용하면 된다.
사자와 호랑이 클래스를 동물로부터 상속받을 때 virtual 키워드를 넣어주면 Animal 생성자가 1번만 불려지는 것을 확인할 수 있다.
다이아몬드 상속에 관한 자세한 내용은 다음 게시글에서 다루도록 하겠다.
https://nybot-house.tistory.com/65
'모던C++ > 상속관계 Inheritance' 카테고리의 다른 글
8. Dynamic Cast _C++ (0) | 2022.09.02 |
---|---|
7. Virtual Inheritance 가상 상속_C++ (0) | 2022.09.01 |
5. Pure Virtual Function 순수 가상 함수_ C++ (0) | 2022.09.01 |
4. Virtual Table, Virtual Function _ C++ (0) | 2022.08.31 |
3. 가상 함수 Virtual Function _ C++ / Dynamic Polymorphism (0) | 2022.08.23 |
2. 접근 권한 키워드 - public, private, protected, 파생 클래스 _ C++ (0) | 2022.08.23 |
1. Inheritance 상속이란? _ C++ (0) | 2022.08.23 |