我是这段代码:
#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 d;
A *b1 = &d;
B *b2 = &d;
std::cout << (long)b1 << std::endl <<(long)b2<< std::endl;
}
编译并运行时会产生以下输出:
140734705182320
140734705182328
目前尚不完全清楚为什么不同指向同一地址(&amp; d)的指针有不同的值。
提前感谢。
答案 0 :(得分:12)
C
对象的内存布局类似于:
A base_object_1;
B base_object_2;
char m_c;
两个基础对象具有不同的地址; A
将(通常)与完整对象具有相同的地址,但B
将(通常)不会。当然,他们不能拥有彼此相同的地址,除非至少有一个是空的。
因此,将指向完整对象的指针转换为指向其中一个基础对象的指针必须更改指针值,以便指向正确的地址。