Virutal Function 관련 질문

yjc99의 이미지


interface ITest1
{
virtual void Test1()=0;
};

interface ITest2
{
virtual void Test2()=0;
};

class Test : public ITest1 , public ITest2
{
virtual void Test1();
virtual void Test2();
};

void Test::Test1() {
TRACE0("here1");
}
void Test::Test2() {
TRACE0("here2");
}

////
Test *pTest = new Test;
ITest1 *pITest1 = reinterpret_cast(static_cast(pTest));
pITest1->Test1();

위 코드에서 pITest1->Test1(); 실행하면 결과는?
Test2()가 호출됩니다.
동작이유는 동적으로 Virtual Table 을 찾기때문인것쯤(?)으로 이해되는데, 정확하게 이해하지를 못하겠습니다.
아시는 분 계시면, 가르쳐주시면 감사하겠습니다.^

navidad의 이미지

아래 코드가 맞는건가요?

ITest1 *pITest1 = reinterpret_cast(static_cast(pTest));

reinterpret_cast 까지 사용해야 하는지 모르겠습니다만,
의도한게 아래와 같은 것이라는 가정에서 테스트본 결과 here1 이 출력됩니다.

VS 2005 Express로 테스트했습니다.

#include <stdio.h>
 
struct ITest1
{
virtual void Test1()=0;
};
 
struct ITest2
{
virtual void Test2()=0;
};
 
struct Test : public ITest1 , public ITest2
{
virtual void Test1();
virtual void Test2();
};
 
void Test::Test1() {
printf("here1\n");
}
void Test::Test2() {
printf("here2\n");
}
 
int main()
{
	Test *pTest = new Test;
	//ITest1 *pITest1 = reinterpret_cast(static_cast(pTest));
	ITest1 *pITest1 = reinterpret_cast<ITest1*>(pTest);
	pITest1->Test1();
	return 0;
}

=================================
나비아빠

=================================
나비아빠

박민권의 이미지

질문게시판으로 가야하지 않을까요;;

yjc99의 이미지

질게로 옮깁니다.
참고로 꺽쇠를 띄어쓰지 않으면 표시가 안되네요. ㅜ.ㅜ
ITest1 *pITest1 = reinterpret_cast< ITest2* >(static_cast< ITest1* >(pTest)); 입니다.