Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 为什么铸造对象';指向同一类的s地址是否指向另一个对象值?_Visual Studio 2008_Casting_Watch - Fatal编程技术网

Visual studio 2008 为什么铸造对象';指向同一类的s地址是否指向另一个对象值?

Visual studio 2008 为什么铸造对象';指向同一类的s地址是否指向另一个对象值?,visual-studio-2008,casting,watch,Visual Studio 2008,Casting,Watch,我有一个类RTSG::XML3D::OpenGLMeshMA的对象。在其方法RTSG::XML3D::OpenGLMeshMA::onXflowStateChanged的断点处停止时,我将以下表达式添加到监视窗口中: 为什么将对象的原始地址强制转换为与此相同的指针类型会导致不同的对象(对象和uniqieId成员在第一行和第二行中具有不同的值) 系统信息:VS 2008 3.5 SP1,Win 7 64位。唯一合理的解释(除错器错误除外)是使用多重继承。对象的开头不是0x0a72d4e4,而是在

我有一个类RTSG::XML3D::OpenGLMeshMA的对象。在其方法RTSG::XML3D::OpenGLMeshMA::onXflowStateChanged的断点处停止时,我将以下表达式添加到监视窗口中:

为什么将对象的原始地址强制转换为与此相同的指针类型会导致不同的对象(对象和uniqieId成员在第一行和第二行中具有不同的值)


系统信息:VS 2008 3.5 SP1,Win 7 64位。

唯一合理的解释(除错器错误除外)是使用多重继承。对象的开头不是
0x0a72d4e4
,而是在其他地方(可能是更高或更低的指针)。带强制转换的行强制调试器将该地址视为对象的开始,因此它读取的值不正确


对于多重继承,“this”的值可以不同于对象的起始地址,编译器会根据需要插入调整。例如,

中讨论过,尽管我找不到相关文档,但我猜这是对象的内部引用。而您的第一个是对它的外部引用。这解释了为什么您只能在实例中使用它,它没有外部引用。@JoshuaDrake什么是内部引用,它与外部引用有何不同?这些是指针,不是引用,不是吗?指针是一般意义上的引用。看看C版本。我现在明白你的意思了。我感到困惑,因为C++也有引用(Foo&)。我想知道为什么一个对象在外部和内部会有不同的指针?
vtable
是否与此相关?还要注意,外部指针指向未初始化的堆内存模式(0xCDCD)。也许这暗示了什么。我想知道为什么这个问题会谈论.NET版本和64位,我们同时看C++和32位指针。- 1:两个表达式都有相同的类型。多重继承不能解释这一点。不存在与类型无关的“对象的开始”,因为任何对象都可以是派生对象(继承)的子对象(布局术语)。当然,顶部对象显示的类型与第二行中的对象相同。这是C风格的演员阵容,当然是。而多重继承只能在类型不同时解释同一指针的不同解释。假设“this”实际上是指向派生对象的OpenGLMeshMA子对象的指针,该派生对象从多个OpenGLMeshMA继承而来,这看起来很荒谬。即使这样,两个(相同的)指针也无法指向对象中不同的OpenGLMeshMA实例。这个IDE肯定发生了其他事情。我不知道当时发生了什么,但一定是某种调试器错误。