12.6 v-table에 관하여

보물창고·2021년 8월 13일
0

가상함수가 호출되는 과정

//전제 조건으로 부모클래스에 가상함수가 하나라도 존재한다 가 깔려있어야한다.

  • 클래스 할당이 상향형변환 되어 있고, 파생클래스의 생성자를 호출할때,
    부모 클래스의 생성자로 향하면서 부모 클래스에 가상함수들의 포인터들이 저장된 v-table이 만들어지고, v-table을 가리키는 v-table 포인터가 만들어진다.
    자식클래스의 생성자로 오면서 자식클래스에서도 v-table과 v-table 포인터가 만들어진다.
    가상함수를 호출할 경우, 자식클래스의 v-table포인터가 자식클래스의 v-table로 향하고, v-table에 있는 함수포인터를 선택하고, 해당 포인터가 가리키고 있는 오버라이딩 함수가 호출된다.
    (추가적으로 자식쪽에 함수포인터가 없다면 부모 포인터를 가리키게 된다.)

과정을 그림으로 확인해보자.

  • 부모 클래스

  • 파생클래스

  • main부

  • 디버깅 시작!
    1 단계)

    2단계) 일단 파생클래스로

3단계) 파생클래스의 생성자 호출 전에 부모의 생성자부터 호출해야지

-> 가상테이블을 확인할 수 있따.

4단계) 파생클래스의 생성자로

: [1]번을 보면 파생클래스에는 Hi함수가 없어서 부모쪽의 Hi를 가리키는 것을 확인할 수 있다.
심지어 3단계 그림과 비교하면 주소값이 동일한 것을 확인할 수 있다.

5단계) 호출하기 일보직전인 상태

6단계) 파생클래스의 함수를 호출하자.

: 파생클래스의 v-포인터를 이용해 호출!

profile
🔥🔥🔥

0개의 댓글