Tak, wiem, że downcast przy użyciu dynamic_cast
nie może się skompilować, jeśli Base
nie jest polimorficzny, ale mój problem nie dotyczy tego.`dynamic_cast` from Base to 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?
}
myślałem kiedy pb = new Derived;
, pb
faktycznie wskazuje na Derived
obiektu leży w stercie. Po pd = dynamic_cast<Derived*>(pb);
, pd
również wskazuje na ten obiekt Derived
, więc pd->foo()
powinno być w porządku.
Ale kiedy pb = new Base;
, co pb
wskazuje na to Base
obiekt w sterty, a następnie po pd = dynamic_cast<Derived*>(pb);
, jak można pd->foo()
prace? Czy obiekt dynamic_cast
przekształcił obiekt w stertę w obiekt o numerze Derived
?
Kiedy mówię 'pd-> foo();', wtedy 'foo()' zostanie wywołane bez względu na 'pd' jest' NULL' czy nie? – Alcott
@Alcott tak, ale parametr 'this' zostanie przekazany jako NULL (ponieważ jest to wartość' pd'). Stąd oczekiwana awaria, gdy wyłączysz ją, uzyskując dostęp do 'a' w przykładzie Rohana. – littleadv
Jest to w dużej mierze zależne od kompilatora, a jak wspomniał już @Luchian Grigore, wszystko może się zdarzyć. Tak więc w większości przypadków tak, ale jest to coś, na co nie można liczyć. –