`dynamic_cast` из Base в Derived

Да, я знаю, что downcast с использованием dynamic_castне может скомпилироваться, если Baseне является полиморфным, но мой проблема не в этом.

class Base {
    public:
        virtual void bar()
        {
            cout << "bar\n";
        }
};

class Derived: public Base {
    public:
        void foo()
        {
            cout << "foo\n";
        }
};

int main()
{
    Base *pb;
    Derived *pd;

    pb = new Derived;  //Base* points to a Derived object
    pd = dynamic_cast<Derived*>(pb); 
    pd->foo();  //outputs foo

    pb = new Base;  //Base* points to a Base object
    pd = dynamic_cast<Derived*>(pb);  
    pd->foo();  //outputs foo, too. Why?
}

Я думал, что когда pb = new Derived;, pbна самом деле указывает на Derivedобъект, лежащий в куче. После pd = dynamic_cast(pb);, pdтакже указывает на этот объект Derived, поэтому pd->foo()должно быть в порядке.

Но когда pb = new Base;, pbуказывает на объект Baseв куче, то после pd = dynamic_cast(pb);, как может работать pd->foo()? Превратил ли dynamic_castобъект Baseв кучу в объект Derived?

11
задан Alcott 2 April 2012 в 09:15
поделиться