Vediamo questo codice:Come chiamare funzione virtuale della classe derivata tramite puntatore alla classe base
class CBase
{
public:
virtual vfunc() { cout << "CBase::vfunc()" << endl; }
};
class CChild: public CBase
{
public:
vfunc() { cout << "CChild::vfunc()" << endl; }
};
int main()
{
CBase *pBase = new CBase;
((CChild*)pBase)->vfunc(); // !!! important
delete pBase;
return 0;
}
L'output è:
CBase::vfunc()
Ma io voglio vedere: CChild :: vfunc()
Explicit ((CChild *) pBase) consente di digitare "CChild *". Quindi, perché chiamare vfunc derivato() ho bisogno di sostituire stringa "importante" con: ((CChild *) pBase) -> CChild :: vfunc();
Quindi, come capire Schildt H .: "un puntatore di classe base può anche essere usato come puntatore a un oggetto di qualsiasi classe derivata da quella base". – LEXX
E quindi perché la stringa ((CChild *) pBase) -> CChild :: vfunc() funziona? – LEXX
@LEXX: in primo luogo, dovresti masterizzare quel libro e ottenere [un buon libro introduttivo] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). Quello che dice in quella citazione è corretto, però. Un puntatore di classe base ('CBase *') può puntare a un oggetto di un tipo derivato da 'CBase' (come' CChild').Questo non è quello che hai fatto, però: il tuo puntatore di classe base punta ad un oggetto di classe base. Se si avesse, ad esempio, 'CBase * p = new CChild();', quindi 'p' sarebbe un puntatore di classe base che punta a un oggetto di una classe derivata. –