Un oggetto di tipo Child*
non può essere associato a un Parent*&
esattamente per lo stesso motivo per cui un Child**
non può essere convertito in un Parent**
. Permetterebbe al programmatore (intenzionalmente o meno) di rompere la sicurezza del tipo senza un cast.
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.
}
Modifica
ritengo che alcune delle confusione nasce a causa dell'uso sciolto delle parole 'convert' e 'conversione'.
I riferimenti non possono essere rimbalzi, a differenza degli oggetti che possono essere riassegnati, quindi nel contesto dei riferimenti quando parliamo di conversione possiamo solo preoccuparci dell'inizializzazione di un nuovo riferimento.
I riferimenti sono sempre legati a un oggetto e dalla domanda dell'OP era chiaro che il suo obiettivo è ottenere un riferimento che è un vincolo diretto a un oggetto esistente. Questo è consentito solo se l'oggetto utilizzato per inizializzare il riferimento è compatibile con riferimento con il tipo di riferimento. Essenzialmente, questo è solo se i tipi sono uguali, o il tipo dell'oggetto è derivato dal tipo di riferimento e il tipo di riferimento è almeno come qualificato cv come oggetto di inizializzazione. In particolare, i puntatori a tipi diversi non sono compatibili con i riferimenti, indipendentemente dalla relazione dei tipi puntati.
In altri casi, un riferimento può essere inizializzato con qualcosa che può essere convertito nel tipo di riferimento. In questi casi, tuttavia, il riferimento deve essere const e non volatile e la conversione creerà un riferimento temporaneo e il riferimento sarà legato a questo oggetto temporaneo e non all'oggetto originale. Come sottolineato, questo non è adatto per i requisiti dell'esempio motivante dell'OP.
In sintesi, un Child
può essere legato direttamente ad un Parent&
ma un Child*
non può essere direttamente legato a una Parent*&
. A Parent* const&
può essere inizializzato con un Child*
, ma il riferimento verrà effettivamente associato a una copia temporanea dell'oggetto Parent*
inizializzata dall'oggetto Child*
.
fonte
2009-04-10 09:17:03
Perché restituire 1; alla fine di main()? Non dovrebbe essere restituito 0; ? – DeadHead
Ho appena copiato il codice dalla domanda collegata..ma quello non è correlato alla domanda – Naveen
Oh, so che non era realmente correlato alla domanda. La semplice curiosità combinata con il pensiero potrebbe esserci stato un vuoto nella mia conoscenza. – DeadHead