Ja, ich weiß, dass Downcast mit dynamic_cast
kann nicht kompilieren, wenn die Base
nicht polymorph ist, aber mein Problem ist nicht darüber.`dynamic_cast` von Base zu Derived
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?
}
Ich dachte, wenn pb = new Derived;
, pb
auf ein Objekt tatsächlich Punkte Derived
in Haufen liegt. Nach pd = dynamic_cast<Derived*>(pb);
, pd
verweist auch auf das Derived
Objekt, also pd->foo()
sollte OK sein.
Aber wenn pb = new Base;
, was pb
Punkte ist ein Base
Objekt in Haufen, dann nach pd = dynamic_cast<Derived*>(pb);
, wie konnte pd->foo()
funktioniert? Hat dynamic_cast
das Objekt Base
in Heap in ein Derived
Objekt verwandelt?
Wenn ich 'pd-> foo();' sage, wird 'foo()' aufgerufen, egal, 'pd' ist' NULL' oder nicht? – Alcott
@Alcott ja, aber der 'this' Parameter wird als NULL übergeben (da ist der Wert von' pd'). Daher der erwartete Absturz bei der Dereferenzierung durch den Zugriff auf "a" in Rohans Beispiel. – littleadv
Es ist weitgehend Compiler abhängig, und wie @Luchian Grigore erwähnt hat, kann alles passieren. Also, in den meisten Fällen ja, aber darauf kann man nicht zählen. –