[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; }