[C++] 내부 클래스에서 외부 클래스의 Function에 접근
CS/C/C++ 2009. 7. 30. 11:22내부 클래스를 포함하고 있는 외부 클래스에서 정의된 함수가 가상 함수인 경우,
내부 클래스의 함수에서 외부 클래스의 주소를 정확히 계산 하지 않으면 가상 함수 테이블을 찾을 수 없기 때문에 해당 함수를 호출 할 수 없게 되어 Runtime error가 발생한다
(가상 함수가 아닌 경우는 VTBL을 찾을 필요가 없기 때문에 굳이 시작 주소를 찾지 않고 캐스팅 만으로 충분)
참고 : MFC source code
내부 클래스의 함수에서 외부 클래스의 주소를 정확히 계산 하지 않으면 가상 함수 테이블을 찾을 수 없기 때문에 해당 함수를 호출 할 수 없게 되어 Runtime error가 발생한다
(가상 함수가 아닌 경우는 VTBL을 찾을 필요가 없기 때문에 굳이 시작 주소를 찾지 않고 캐스팅 만으로 충분)
참고 : MFC source code
#define offset(s, m) \
(size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m));
class A
{
public:
class X
{
public:
void callAVtFunc();
} m_x;
virtual void VtFunc() { std::cout << "OK\n"; }
};
void A::X::callAVtFunc()
{
A* a = ((A*)((char*)this - offsetof(A, m_x)));
a->VtFunc();
}
int main(void)
{
A a;
a.m_x.callAVtFunc();
return 0;
}
