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