gpt4 book ai didi

c++ - 为什么即使对象指针在多重继承中不同,这也是相同的?

转载 作者:太空狗 更新时间:2023-10-29 20:07:41 25 4
gpt4 key购买 nike

当使用多重继承时,C++ 必须维护多个 vtable,这导致对公共(public)基类有“多个 View ”。

这是一个代码片段:

#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

此处 casted1casted2 具有不同的值,这是合理的,因为它们指向不同的子对象。在调用虚函数时,已经完成对基类的转换,编译器不知道它最初是最派生类。 this 每次都是一样的。它是如何发生的?

最佳答案

当在虚函数调用中使用多重继承时,对虚函数的调用通常会转到调整 this 指针的“thunk”。在您的示例中,casted1 指针的 vtbl 条目不需要 thunk,因为 CClassIDerived1 子对象恰好与CClass 对象的开始(这就是为什么 casted1 指针值与 CClass object 指针相同的原因)。

但是,指向 IDerived2 子对象的 casted2 指针与 CClass 对象的开始不一致,因此 vtbl函数指针实际上指向一个 thunk 而不是直接指向 CClass::Common() 函数。 thunk 调整 this 指针以指向实际的 CClass 对象,然后跳转到 CClass::Common() 函数。所以它总是会得到一个指向 CClass 对象开头的指针,而不管它可能是从哪种类型的子对象指针调用的。

在 S tanley Lippman's "Inside the C++ Object Model" book 中对此有很好的解释, section 4.2 "Virtual Member Functions/Virtual Functions Under MI".

关于c++ - 为什么即使对象指针在多重继承中不同,这也是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1747220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com