un objeto de tipo Child*
no se puede enlazar a un Parent*&
por exactamente la misma razón que un Child**
no se puede convertir en un Parent**
. Permitirlo permitiría al programador (intencionalmente o no) romper la seguridad del tipo sin un yeso.
class Animal {};
class DangerousShark : public Animal {};
class CuteKitten : public Animal {};
void f(Animal*& animalPtrRef, Animal* anotherAnimalPtr)
{
animalPtrRef = anotherAnimalPtr;
}
void g()
{
DangerousShark myPet;
CuteKitten* harmlessPetPtr;
f(harmlessPetPtr, &myPet); // Fortunately, an illegal function call.
}
Editar
creo que parte de la confusión surge debido al uso flexible de las palabras 'convertir' y 'conversión'.
Las referencias no pueden ser rebotadas, a diferencia de los objetos que pueden reasignarse, por lo que en el contexto de las referencias cuando hablamos de conversión solo podemos preocuparnos por la inicialización de una nueva referencia.
Las referencias siempre están ligadas a un objeto, y por la pregunta del OP, estaba claro que intenta obtener una referencia que sea un enlace directo a un objeto existente. Esto solo está permitido si el objeto utilizado para inicializar la referencia es compatible con la referencia con el tipo de la referencia. Básicamente, esto es solo si los tipos son los mismos, o el tipo del objeto se deriva del tipo de la referencia y el tipo de referencia está al menos tan calificado como cv como el objeto de inicialización. En particular, los punteros a diferentes tipos no son compatibles con la referencia, independientemente de la relación de los tipos apuntados.
En otros casos, una referencia se puede inicializar con algo que se puede convertir al tipo de referencia. En estos casos, sin embargo, la referencia debe ser const y no volátil y la conversión creará un temporal y la referencia estará vinculada a este objeto temporal y no al original. Como se señaló, esto no es adecuado para los requisitos del ejemplo motivador de OP.
En resumen, un Child
se pueden unir directamente a un Parent&
sino un Child*
no se pueden unir directamente a un Parent*&
. Se puede inicializar un Parent* const&
con un Child*
, pero la referencia realmente se vinculará a un objeto temporal Parent*
copiado-inicializado desde el objeto Child*
.
Por qué return 1; al final de main()? ¿No se supone que es return 0? ? – DeadHead
Acabo de copiar pegado el código de la pregunta vinculada ... pero eso no está relacionado con la pregunta – Naveen
Oh, sé que no estaba realmente relacionado con la pregunta. Mera curiosidad combinada con pensar que podría haber habido alguna brecha en mi conocimiento. – DeadHead