Sì, so che il downcast che utilizza dynamic_cast
non può essere compilato se lo Base
non è polimorfico, ma il mio problema non riguarda questo.`dynamic_cast` da Base a 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?
}
ho pensato quando pb = new Derived;
, pb
in realtà punta a un oggetto Derived
sta nel mucchio. Dopo pd = dynamic_cast<Derived*>(pb);
, pd
punta anche a tale oggetto Derived
, quindi pd->foo()
dovrebbe essere OK.
Ma quando pb = new Base;
, cosa pb
punti per è un oggetto Base
in mucchio, poi dopo pd = dynamic_cast<Derived*>(pb);
, come potrebbe pd->foo()
funziona? dynamic_cast
ha trasformato l'oggetto Base
in heap in un oggetto Derived
?
Quando dico 'pd-> foo();', allora 'foo()' viene chiamato non importa 'pd' è' NULL' o no? – Alcott
@Alcott yes, ma il parametro 'this' verrà passato come NULL (poiché questo è il valore di' pd'). Da qui l'incidente previsto quando lo stai dereferendo accedendo a 'a' nell'esempio di Rohan. – littleadv
Dipende in gran parte dal compilatore e, come ha detto @Luchian Grigore, può succedere di tutto. Quindi, nella maggior parte dei casi, sì, ma è qualcosa su cui non puoi contare. –