Veamos este código:Cómo llamar a la función virtual de la clase derivada a través del puntero de clase 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;
}
La salida es:
CBase::vfunc()
Pero yo quiero ver: CChild :: vfunc()
explícita ((CChild *) pBASE) arroja que escribir "CChild *". Entonces, ¿por qué llamar a vfunc derivado? Necesito reemplazar cadena "importante" con: ((CChild *) pBase) -> CChild :: vfunc();
Entonces, ¿cómo entender Schildt H .: "un puntero de clase base también puede ser utilizado como un puntero a un objeto de cualquier clase derivada de esa base". – LEXX
¿Y por qué funciona la cadena ((CChild *) pBase) -> CChild :: vfunc()? – LEXX
@LEXX: Primero, debe grabar ese libro y obtener [un buen libro introductorio] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). Sin embargo, lo que dice en esa cita es correcto. Un puntero de clase base ('CBase *') puede apuntar a un objeto de un tipo derivado de 'CBase' (como' CChild').Sin embargo, eso no es lo que has hecho: tu puntero de clase base apunta a un objeto de clase base. Si tuviera, por ejemplo, 'CBase * p = new CChild();', entonces 'p' sería un puntero de clase base que apunta a un objeto de una clase derivada. –