Да, я знаю, что 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<Derived*>(pb);
, pd
также указывает на объект Derived
, поэтому pd->foo()
должен быть в порядке.
Но когда pb = new Base;
, то, что pb
указывает на объект Base
в куче, затем после pd = dynamic_cast<Derived*>(pb);
, как мог pd->foo()
работать? Разве dynamic_cast
превратил объект Base
в кучу в объект Derived
?