Как могут указатели подклассов строго равняться указателям родительских классов?

Я писал оператор == между двумя видами интеллектуальных указателей и подумал, что мне нужно выполнить быструю проверку работоспособности. Я удивлен результатом ...

В приведенном ниже фрагменте кода получается, что все варианты f и b имеют одинаковое значение?

struct Foo {
    int x;
};

struct Bar : public Foo {
    int y;
};

#include <iostream>

int main ()
{
    Bar bar;

    Foo * f = &bar;
    Bar * b = &bar;
    std :: cout << f << " " << b << " " << (f == b) << "\n";

    void * fv = f;
    void * bv = b;
    std :: cout << fv << " " << bv << " " << (fv == bv) << "\n";

    int fi = reinterpret_cast <int> (f);
    int bi = reinterpret_cast <int> (b);
    std :: cout << fi << " " << bi << " " << (fi == bi) << "\n";
}
6
задан nmichaels 29 November 2010 в 20:20
поделиться