다중 상속을 사용하는 경우 C++은 공통 기본 클래스의 "여러보기"를 갖는 여러 vtable을 유지 관리해야합니다. 그것은 다음과 같은 출력을 생성다중 상속에서 오브젝트 포인터가 다른 경우에도 왜 동일합니까?
#include "stdafx.h"
#include <Windows.h>
void dumpPointer(void* pointer)
{
__int64 thisPointer = reinterpret_cast<__int64>(pointer);
char buffer[100];
_i64toa(thisPointer, buffer, 10);
OutputDebugStringA(buffer);
OutputDebugStringA("\n");
}
class ICommonBase {
public:
virtual void Common() = 0 {}
};
class IDerived1 : public ICommonBase {
};
class IDerived2 : public ICommonBase {
};
class CClass : public IDerived1, public IDerived2 {
public:
virtual void Common() {
dumpPointer(this);
}
int stuff;
};
int _tmain(int argc, _TCHAR* argv[])
{
CClass* object = new CClass();
object->Common();
ICommonBase* casted1 = static_cast<ICommonBase*>(static_cast<IDerived1*>(object));
casted1->Common();
dumpPointer(casted1);
ICommonBase* casted2 = static_cast<ICommonBase*>(static_cast<IDerived2*>(object));
casted2->Common();
dumpPointer(casted2);
return 0;
}
:
206968 //CClass::Common this
206968 //(ICommonBase)IDerived1::Common this
206968 //(ICommonBase)IDerived1* casted1
206968 //(ICommonBase)IDerived2::Common this
206972 //(ICommonBase)IDerived2* casted2
여기 casted1
및 casted2
가 서로 다른 하위 객체를 가리 이후 합리적인 다른 값을 가질
는 여기에 코드입니다. 가상 함수가 호출 될 때 기본 클래스에 대한 캐스트가 완료되고 컴파일러는 원래 파생 클래스 였는지 여부를 알지 못합니다. 여전히 이은 매번 동일합니다. 어떻게됩니까?
왜 중요한가요? 이는 C++ 코드와 관련이없는 구현 세부 사항입니다. 컴파일러를 작성하는 경우에만이 세부 사항을 알아야합니다. 사실 나는 세부 사항이 컴파일러간에 동일하게 유지 될 것이라고 확신하지는 않습니다. –
@ Martin 당신의 감정에 동의하지만, 컴파일러가 직면 한 문제는주의를 기울여야 할 흥미로운 것입니다. 예를 들어 알고 있어야하는 경우 가끔은 실제 결과가있는 경우도 있습니다. 캐스트가 특정 방식으로 작동합니다. – asveikau
가상 상속을 사용하지 않고 다이아몬드 상속을 사용 했으므로 그렇게해서는 안됩니다. 아마도 CClass의 vtable에 'Common'이 두 번있을 수 있으므로이 테스트가 어떻게 영향을 미치는지는 알 수 없습니다. –