5

次のコードでは、出力は 136 になります。しかし、最初の 2 つのアドレス比較がどのように等しいのか理解できませんでした。これを理解するための助けに感謝します。ありがとうございました。

#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;

const int a = (reinterpret_cast<char *>(b1) == reinterpret_cast<char *>(&d)) ? 1 : 2;
const int b = (b2 == &d) ? 3 : 4;
const int c = (reinterpret_cast<char *>(b1) == reinterpret_cast<char *>(b2)) ? 5 : 6;

std::cout << a << b << c << std::endl;

return 0;
}
4

3 に答える 3

1

例のように多重継承を使用する場合、最初の基本クラスと派生クラスは同じ基本アドレスを共有します。継承元の追加のクラスは、先行するすべてのクラスのサイズに基づくオフセットで順番に配置されます。dとのベースアドレスb1が同じなので、比較の結果は真です。

あなたの場合、サイズAが4バイトの場合、BベースアドレスA+ 4バイトから始まります。これを行うとB *b2 = &d;、コンパイラはオフセットを計算し、それに応じてポインター値を調整します。

b2 == &dタイプ「C」からタイプ「B」への暗黙的な変換を行うと、比較が行われる前に実行されdます。この変換は、代入の場合と同様に、ポインター値のオフセットを調整します。

于 2013-05-26T22:11:50.027 に答える
0

派生クラス (Cここのような) がメモリに配置されるのは非常に一般的であるため、その 2 つの基本クラス (AおよびB) で開始されるため、型のインスタンスのCアドレスは、最初の基本クラスのインスタンスのアドレスと同じになります。 (つまりA)。

于 2013-05-26T22:15:51.903 に答える