C ++多重继承,与派生对象中的基类地址混淆

时间:2013-09-26 08:17:41

标签: c++ inheritance

为什么以下代码打印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

1 个答案:

答案 0 :(得分:3)

当您将b2&d与未转换为void进行比较时,编译器会隐式地将它们转换为通用数据类型 - 在这种情况下,d被隐式转换为其B2 1}}基类。

当您通过强制转换为void进行比较时,您将获得该对象的真实底层地址,并且由于DB1之前继承B2,因此它是{{1}的地址基类。