Zobaczmy ten kod:Jak wywołać wirtualną funkcję klasy pochodnej przez klasy bazowej wskaźnik
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;
}
Wyjście jest:
CBase::vfunc()
Ale chcę zobaczyć: CChild :: vfunc()
Jawny ((CChild *) pBase) rzuca, aby wpisać "CChild *". Dlaczego więc wywołać pochodną vfunc() Potrzebuję zastąpić "ważny" ciąg z: ((CChild *) pBase) -> CChild :: vfunc();
Jak więc rozumieć Schildt H .: "wskaźnik klasy bazowej może być również używany jako wskaźnik do obiektu dowolnej klasy wywodzącej się z tej bazy". – LEXX
A więc dlaczego łańcuch ((CChild *) pBase) -> CChild :: vfunc() działa? – LEXX
@LEXX: Po pierwsze, powinieneś nagrać tę książkę i dostać [dobrą wstępną książkę] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). To, co mówi w tym cytacie, jest poprawne. Wskaźnik klasy bazowej ('CBase *') może wskazywać na obiekt typu pochodzącego z 'CBase' (jak' CChild').Jednak to nie jest to, co zrobiłeś: wskaźnik twojej klasy bazowej wskazuje na obiekt klasy bazowej. Gdybyś miał na przykład 'CBase * p = new CChild();', wówczas 'p' byłby wskaźnikiem klasy bazowej wskazującym na obiekt klasy pochodnej. –