为什么以下代码打印01
?
我期待00
。如果地址不相等,为什么operator ==在第一种情况下返回true?
#include <iostream>
class B1
{
int m_i;
};
class B2
{
double m_d;
};
class D
: public B1
, public B2
{
};
int main()
{
D d;
B2 *b2 = &d;
std::cout << "d:\t" << reinterpret_cast<void*>(&d) << "\t" << &d << "\n";
std::cout << "b2:\t" << reinterpret_cast<void*>(b2) << "\t" << b2 << "\n";
std::cout << (reinterpret_cast<void*>(b2) == reinterpret_cast<void*>(&d));
std::cout << (b2 == &d);
return 0;
}
提供输出:
d: 0xbfd65fa4 0xbfd65fa4
b2: 0xbfd65fa8 0xbfd65fa8
01
答案 0 :(得分:3)
当您将b2
和&d
与未转换为void进行比较时,编译器会隐式地将它们转换为通用数据类型 - 在这种情况下,d
被隐式转换为其B2
1}}基类。
当您通过强制转换为void进行比较时,您将获得该对象的真实底层地址,并且由于D
在B1
之前继承B2
,因此它是{{1}的地址基类。