J'ai un doute, la fonction ci-dessous peut recevoir un objet de type A ou quelque chose de type dérivé. si nous l'appelons comme ceci: p> L'objet pointé par HPTR code> est en réalité de type A ou B?
Est sécuritaire de faire cela? P> p>
6 Réponses :
L'objet retourné est de type pointeur sur un code>, ce qui signifie que l'objet pointé par
HPTR code> est de type
A code>. Il n'est pas sûr car les méthodes d'appel ou les membres exclusives à B provoqueront un accident ou un comportement indéfini. Vous recherchez probablement le modèle d'usine . P>
Ce n'est pas sûr, il est incorrect et le compilateur devrait vous donner des diagnostics. Avez-vous essayé de compiler avec g ++ -wall code> si vous utilisez GCC? P>
Désolé, j'ai écrit le code de la mémoire et je ne pouvais pas essayer de compiler.
Lorsque vous faites ci-dessous dans votre code:
virtual A* MakeCopy();
Un moyen sûr est de fournir une méthode de clone virtuel
ne compile pas: si vous modifiez le type de HPTR code> sur
A * code> il compile, mais vous obtenez toujours un objet
A code>. Le constructeur de copie par défaut pour
A code> que vous utilisez créera un objet
A code> et copier les champs de l'objet
b code> qui ont été définis dans
A code>, tranchez le
B code> Partie OFF. P> P>
À cause de tous les problèmes décrits ci-dessus / dans ce post - si vous pouvez l'éviter (et je ne peux pas penser à une raison pour laquelle vous ne pouviez pas) - vous ne devez concevoir votre code pour exiger " Comme le souligne Luchian, vous voulez probablement une usine. L'usine crée votre objet sur le tas pour commencer (et retourne un pointeur intelligent pour gérer la durée de vie de l'objet / pointeur / mémoire). P> CopytoHeap code> ". p>