2014-06-27 7 views
1

Je comprends les côtelettes à trancher au large des pièces sous spécifiques à chaque classe supplémentaire d'un objet, lorsque nous attribuons une super classe à une sous-classe, comme ceci:Pourquoi le découpage se produit-il exactement?

Sub mySub; 
Super mySuper = &mySub; 
// mySuper DOESN'T contain any sub class behaviour 

et si nous avons fait:

Sub mySub; 
Super& mySuper = &mySub; 
// mySuper DOES contain the sub class behaviour 

mais je ne comprends pas pourquoi la référence fonctionne et pourquoi l'objet ne fonctionne pas.

J'ai vu la raison est parce que sans une référence l'objet doit être copié - mais je ne vois toujours pas pourquoi cela devrait entraîner le découpage en tranches?

Je ne comprends pas non plus pourquoi la référence fonctionne. Nous pointons une référence Super au début d'un objet Sub mais le compilateur sait à quel point un super objet devrait être, donc je ne m'attendrais pas à associer la mémoire au-delà de la partie Super (correspondant au sous-classe de l'objet) à la référence Super?

+5

_Slicing_ est un effet secondaire de _copying_. La création d'une référence ne copie pas l'objet. –

+2

'& mySub' ... y a-t-il une faute de frappe? C'est une adresse. –

+0

"Nous pointons une référence Super au début d'un objet Sub" - ce n'est pas vrai! (même si je remplace la référence par un pointeur) Le pointeur pointe vers le début de l'objet 'Super' contenu dans l'objet' Sub'. C'est une énorme différence lorsque vous utilisez l'héritage multiple: la valeur du pointeur dépend de la classe de base dans laquelle vous convertissez l'objet! – Csq

Répondre

4
Super mySuper = mySub; 

Dans ce cas, un nouvel objet est instancié et le constructeur de copie est appelé. Il est seulement raisonnable que le nouvel objet ne contienne aucun extras.

Super& mySuper = mySub; 

Dans ce cas, vous définissez une référence à l'objet. Une référence est comme un pointeur et ne sait pas quelle est la taille de l'objet. Seulement quel type d'objet il fait référence et où il se trouve dans la mémoire. Basé sur quelles classes "Sub" est dérivé de cette adresse de mySuper peut différer de l'adresse de mySub. Vous pouvez facilement essayer cela en utilisant des pointeurs et en imprimant leurs valeurs. Bien que la référence elle-même ne connaisse que l'emplacement de la partie "Super" de l'objet, vous pouvez la rejeter; le compilateur sait où trouver le reste de l'objet "Sub", s'il en est vraiment un.

Questions connexes