올바르게 이해하면 클래스 정의는 vtable에 가상 함수의 특정 순서를 부과합니다. 따라서 주어진 함수는 해당 함수의 처음부터 특정 오프셋에있는 것으로 알려져 있습니다. 표. 그러나, 나는 그것이 다형성과 어떻게 작용하는지 이해하지 못합니다.vtable 및 다형성 - 함수의 오프셋
class B1 {
virtual void funcB1();
};
class B2 {
virtual void funcB2() {}
};
class D : public B1, public B2 {
virtual void funcB1() {}
virtual void funcB2() {}
};
void main(...) {
B1 *b1 = new D();
B2 *b2 = new D();
B1 *realB1 = new B1();
B2 *realB2 = new B2();
b1->funcB1();
b2->funcB2();
realB1->funcB1();
realB2->funcB2();
}
생성 된 코드는 funcB2에 다른 오프셋으로 어떻게 액세스하는지 어떻게 알 수 있습니까?
B2 *를 허용하는 함수를 호출 할 때 컴파일러가 실제 B2 또는 D를 가져 오는 지 여부를 어떻게 알 수 있습니까? 이를 확인하고 그에 따라 오프셋을 계산하는 런타임 코드가 추가됩니까? – Dorfl
@Dorfl 컴파일러가'B2 * '를 사용하는 함수를 호출하면, 호출 시점에 자동으로'D *'의 캐스트를 삽입하여 함수 포인터가 보이고 동작하게합니다 마치 B2에 대한 순수한 포인터 인 것처럼. – dasblinkenlight
마침내 얻었습니다! 감사! 죄송합니다. 아직 투표 할 수 없지만 필요한 평판이 없습니다. – Dorfl