가상 상속

김대익·2022년 3월 7일

일반 상속과 가상 상속의 차이

일반 상속을 받을경우 24bytes

가상 상속시 32bytes가 나오는데 이는 객체 구성이 달리지기 때문이다.



일반적인 상속의 경우 animal로 되어있기 때문에 animal객체 내부만 볼 수 있다.
또한 가상테이블 주소는 Lion 가상테이블을 가리키고,
Lion 가상테이블 안에는 Lion::speak()함수를 가리키는 포인터, Lion의 소멸자를 가리키는 소멸자를 가지고 있다.
Lion::speak()함수에서 Lion의 변수, 함수등을 사용하더라도 위치를 알고있으므로 상관없다.

하지만 가상 상속을 할 경우

animal 객체의 VT포인터는 Lion::speak()함수와 Lion소멸자를 가리키는 포인터들이 있는 주소를 가리킨다.
이 때 Lion::speak()함수에서 Lion클래스의 데이터를 사용한다면
animal 객체의 시작점이 3번째칸인 *VT부터이므로 Lion Data가 어디있는지 모른다.
따라서

이런 offset정보를 넣어서 알려준다. 이는 실제 Lion 객체의 시작점이 16bytes전 부터 시작된다는 것을 알려준다.
offset을 계산해서 Lion::speak함수를 실행하라는 함수는
thunk를 붙여주는 것이다.
이런 구조인 이유는 base 클래스의 데이터 정보의 크기에 따라 접근 위치를 다이나믹하게 정하기 위해서이다.



가상 상속을 사용하면 animal 객체가 하나밖에 없으니 animal constructor가 한번만 호출되고, animal 데이터의 중복을 막아준다

0개의 댓글