1

비 가상 구현을 호출하는 경우 vtable을 통해 디스패치 기능을 수행할까요?

다음과 같다고 가정 해보십시오.

struct Base 
{ 
    virtual void callback() { /* */ } 
}; 

struct Derived : public Base 
{ 
    void callback() { /* */ } 
}; 

Base* obj = new Derived; 
static_cast<Derived*>(obj)->callback(); 

콜백 호출은 vtable 또는 직선 함수 호출을 통해 함수 시그니처에 가상으로 표시되어 있지 않으므로 호출합니까?

+0

왜 static_cast입니까? –

답변

4
Derived::callback

내재적 virtual이다.

즉, vtable의 사용 여부는 컴파일러와 컴파일러가 수행하는 최적화에 따라 달라집니다. 컴파일러는 objDerived 객체를 가리키고 있다는 것을 여기서 알 수 있으므로 callback 가상 함수의 최종 재정의자가 무엇인지 알고 있으므로 vtable에서 함수를 조회하지 않고도 호출 할 수 있습니다. 그것은 컴파일러와 최적화 설정에 따라 다릅니다.

+0

Base에서 파생되도록 업데이트되었습니다. – Graeme

관련 문제