对于polymorph类的对象,对象的地址和指向对象的指针是否相同? 我试图解决C++测试,看到这个问题。 #include <iostream> class A { public: A() : m_i(0) { } protected: int m_i; }; class B { public: B() : m_d(0.0) { } protected: double m_d; }; class C : public A , public B { public: C() : m_c('a') { } private: char m_c; }; int main() { C c; A *pa = &c; B *pb = &c; const int x = (pa == &c) ? 1 : 2; const int y = (pb == &c) ? 3 : 4; const int z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)) ? 5 : 6; std::cout << x << y << z << std::endl; return 0; }

对于polymorph类的对象,对象的地址和指向对象的指针是否相同? 我试图解决C++测试,看到这个问题。 #include <iostream> class A { public: A() : m_i(0) { } protected: int m_i; }; class B { public: B() : m_d(0.0) { } protected: double m_d; }; class C : public A , public B { public: C() : m_c('a') { } private: char m_c; }; int main() { C c; A *pa = &c; B *pb = &c; const int x = (pa == &c) ? 1 : 2; const int y = (pb == &c) ? 3 : 4; const int z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)) ? 5 : 6; std::cout << x << y << z << std::endl; return 0; },c++,pointers,inheritance,polymorphism,multiple-inheritance,C++,Pointers,Inheritance,Polymorphism,Multiple Inheritance,有人能解释它的输出吗?我认为基指针指向基部分的一部分,所以它不是对象的真实地址 谢谢。pa指向c的A子对象pb指向c的B子对象。显然,它们指向内存中的不同位置(因此输出中的6) 但是当将它们与&c进行比较时,&c再次分别转换为A*和B*,从而指向相同的A和B子对象 以下是c在内存中可能的布局示意图: +------------------------+-------------+-------------------+ |A子对象| B子对象| C的余数| +------------------

有人能解释它的输出吗?我认为基指针指向基部分的一部分,所以它不是对象的真实地址


谢谢。

pa
指向
c
A
子对象
pb
指向
c
B
子对象。显然,它们指向内存中的不同位置(因此输出中的
6

但是当将它们与
&c
进行比较时,
&c
再次分别转换为
A*
B*
,从而指向相同的
A
B
子对象

以下是
c
在内存中可能的布局示意图:

+------------------------+-------------+-------------------+
|A子对象| B子对象| C的余数|
+------------------------+-------------+-------------------+
^&c在这里^pb点在这里
^pa也指出了这一点

pa
指向
c
A
子对象
pb
指向
c
B
子对象。显然,它们指向内存中的不同位置(因此输出中的
6

但是当将它们与
&c
进行比较时,
&c
再次分别转换为
A*
B*
,从而指向相同的
A
B
子对象

以下是
c
在内存中可能的布局示意图:

+------------------------+-------------+-------------------+
|A子对象| B子对象| C的余数|
+------------------------+-------------+-------------------+
^&c在这里^pb点在这里
^pa也指出了这一点

背景

对象C在内存中看起来像这样

    -----------  <----- Start of the object
    |    A    |
    |---------|  <----- Beginning of B implementation
    |    B    |
    |---------|
    |    C    |
    |_________|  <----- End of the object

这将导致编译错误,因为您需要将两个指针强制转换为一个公共类型。

Background

对象C在内存中看起来像这样

    -----------  <----- Start of the object
    |    A    |
    |---------|  <----- Beginning of B implementation
    |    B    |
    |---------|
    |    C    |
    |_________|  <----- End of the object

这将给您一个编译错误,因为您需要将两个指针强制转换为一个公共类型。

添加了输出-感谢您提供了一个实际上是MCVE的代码段:)添加了输出-感谢您提供了一个实际上是MCVE的代码段:)
&c
分别转换为
a*
B*
,并比较子对象地址。除非有人趁没人注意的时候偷偷溜进一个神奇的隐式向下转换。你确定这个结构吗?或者这只是一个例子?@molbdnilo-True!我的错。@GrigorApoyan这是编译器在实践中最有可能生成的(前提是没有进行虚拟继承)
&c
分别转换为
A*
B*
,并比较子对象地址。除非有人趁没人注意的时候偷偷溜进一个神奇的隐式向下转换。你确定这个结构吗?或者这只是一个例子?@molbdnilo-True!我的错。@GrigorApoyan这是编译器在实践中最有可能生成的(前提是没有虚拟继承进行)
((A*)pa == (A*)&c) // Obviously true, since we defined it as such above.
((B*)pb == (B*)&c) // Obviously true, since we defined it as such above.
(reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)) // We know pa and pb point to different places in memory. If we cast them both to char*, they will obviously not be equivalent.
if (pa == pb)