C++은 가상 함수를 처리하기 위해서 가상 함수를 갖는 클래스마다 가상 함수 테이블을 생성한다.

가상 함수 테이블은 클래스에서 가상 함수 포인터를 모아둔 배열이다.

이게 있어야 자식에서 오버라이딩한 함수를 찾아서 호출할 수 있다. 만약 부모에서 virtual로 선언했으나 자식에서 오버라이딩을 하지 않은 경우 부모의 가상함수포인터가 포함된다.

Untitled

실제로 비주얼스튜디오로 디버깅해보면 클래스 인스턴스의 값을보면 _vfptr이 해당 가상함수 테이블이다. 캡쳐에서 보면 B는 A를 상속받았지만 Move 함수만 override 해서 재정의해서 가상함수 테이블에서는 Move만 B의 네임스페이스를 가지는 것을 알 수 있다.

만약 생성자에서 가상함수를 호출한다면?

가상 함수 호출은 객체의 실제 타입에 따라 동적으로 호출되는데, 생성자에서 가상 함수를 호출하면 예상치 못한 동작이 발생할 수 있다.

이 과정을 이해하려면 C++에서 객체의 생성 과정을 알아야 한다.

가상 함수 호출은 객체의 실제 타입에 따라 동적으로 결정된다.

생성자의 경우 파생 클래스의 생성자가 호출되기 전에 기본 클래스의 생성자가 호출되므로 파생 클래스의 가상 함수는 아직 초기화되지 않은 상태일 수 있으므로 아래와 같은 문제를 발생시킬 수 있다