2

以下のコードが出力されるのはなぜ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
4

1 に答える 1

3

void にキャストせずに比較するb2と、コンパイラはそれらを共通のデータ型に暗黙的にキャストしています。この場合、基本クラスに暗黙的にキャストしています。&ddB2

void にキャストして比較すると、オブジェクトの真の基礎となるアドレスが得られます。これは、以前からD継承されているため、その基本クラスのアドレスです。B1B2B1

于 2013-09-26T08:24:02.550 に答える