dynamic binding
에서 함수 호출은 포인터가 가리키는 개체 유형을 기반으로 함수 구현에 바인딩됩니다. 기본 클래스 하위 객체의 포인터. 어떤 가상 함수 버전이 호출됩니까?
base *bptr = new derived;
bptr->func();
함수
func
기본 클래스에서 가상 선언하자
우리는 다음과 같은 코드가 있다고 가정. 그런 다음 파생 클래스의 가상 함수 func
버전이 동적 바인딩으로 인해 런타임에 호출됩니다.
위의 개념을 이해합니다.
하지만 위의 개념을 연구 한 후에 다음과 같은 개념으로 혼란스러워했습니다.
위의 코드 조각에서 파생 클래스 개체에 대한 포인터는 암시 적으로 기본 클래스 개체에 대한 포인터로 변환됩니다. 그러면 bptr
은 실제로 파생 클래스 객체의 기본 클래스 하위 객체를 가리키고 파생 클래스 객체를 가리 키지 않습니다.
기본 클래스 포인터 bptr
이 기본 클래스 하위 객체를 가리키기 때문에 런타임 중에 기본 클래스의 가상 함수 버전 인 func
을 호출하면 안됩니까? 이 예에서
David : 파생 클래스 객체의 vptr과 기본 클래스 하위 객체의 vptr이 모두 파생 클래스 VTABLE을 가리 킵니까? –
@Linux - vptr은 객체가 실제로있는 유형의 vtable을 가리 킵니다. 여기에서 문제가되지 않는 객체를 가리 키기 위해 사용하는 포인터 *. –
@LinuxPenseur : 파생 형식이 새로운 가상 함수를 선언하지 않는다고 가정하면 파생 된 vtable을 가리키는 기본 하위 개체에 저장된 단일 포인터가 있습니다. –