[C++] 내부 클래스에서 외부 클래스의 Function에 접근

CS/C/C++ 2009. 7. 30. 11:22
내부 클래스를 포함하고 있는 외부 클래스에서 정의된 함수가 가상 함수인 경우,

내부 클래스의 함수에서 외부 클래스의 주소를 정확히 계산 하지 않으면 가상 함수 테이블을 찾을 수 없기 때문에 해당 함수를 호출 할 수 없게 되어 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;
}
: