89 votes

Un pointeur de classe de base peut pointer sur un objet de classe dérivé. Pourquoi l'inverse n'est-il pas vrai?

Un pointeur de classe de base peut pointer sur un objet de classe dérivé. Pourquoi l'inverse n'est-il pas vrai sans casting? Logiquement, une classe de base ne disposerait pas d'informations suffisantes sur la classe dérivée, mais une classe dérivée devrait également disposer des informations de la classe de base. Il me manque des bases ici.

174voto

jk. Points 8019

Si je vous dis que j'ai un chien, vous pouvez supposer que j'ai un chien.

Si je vous dis que j'ai un animal de compagnie, vous ne savez pas si cet animal est un chien, il pourrait être un chat ou peut-être même une girafe. Sans savoir quelques informations supplémentaires que vous ne pouvez pas supposer que j'ai un chien.

de même, un objet dérivé, est une classe de base de l'objet (comme une sous-classe), donc peut être indiqué par une classe de base pointeur. cependant un objet de classe de base n'est pas un objet de classe dérivée ne peut donc pas être attribué à une classe dérivée de pointeur.

(Le bruit que vous entendez est l'analogie étirements)

Supposons maintenant que vous vouliez m'acheter un cadeau pour mon animal de compagnie.

Dans le premier scénario, vous savez que c'est un chien, vous pouvez m'acheter une laisse, tout le monde est heureux.

Dans le deuxième scénario, je ne vous ai pas parlé de ce que mon animal de compagnie, donc si vous allez m'acheter un cadeau de toute façon vous avez besoin de connaître des informations que je n'ai pas dit (ou deviner), vous m'acheter une laisse, si il s'avère que j'ai un chien tout le monde est heureux.

Cependant, si j'ai effectivement eu un chat alors que nous savons maintenant vous avez fait une mauvaise hypothèse (cast) et d'avoir un chat malheureux en laisse (runtime error)

15voto

sharth Points 25625

Nous avons deux objets.

 class A {
   int a;
};

class B : A {
   int b;
};
 

Allouez une instance de B . Nous pouvons nous connecter avec cela sous forme de A* ou de B* .

Allouez une instance de A . Si nous devions utiliser B* , un espace devrait-il être attribué au membre b ?

11voto

Puppy Points 90818

Euh, parce que la classe de base n'est pas une classe dérivée.

Lorsque vous avez un pointeur valide à un type, alors vous voulez dire que l'objet pointé aura certaines données à certains endroits, de sorte que nous pouvons la trouver. Si vous avez un pointeur vers un objet dérivé, puis vous garantir que le pointu pour objet contient toutes Dérivées de données de membres - mais lorsque vous pointez sur une Base, puis il en fait ne l'a pas et de Mauvaises Choses Arrivent™.

Cependant, la Dérivée est la garantie d'avoir la totalité de la Base de données des membres, dans les mêmes lieux. C'est pourquoi un pointeur de Base peut en fait montrer Dérivés.

4voto

Andy Thomas Points 30979

Ceci est valable, car un tigre est un animal:

     Animal * pAnimal = new Tiger();
 

Ce n'est pas valide, car il n'est pas vrai que l'objet est une grenouille à pois.

     PoisonDartFrog * pPoisonDartFrog = new GenericFrog();
 

2voto

FredOverflow Points 88201

C ++ étant un langage typé de manière statique, autoriser des conversions implicites de la base à la dérivée briserait le système de types. Bjarne Stroustrup ne souhaitait aucune erreur d'exécution "message non compris".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X