2010-03-02 2 views

Répondre

5

La ligne, en elle-même, ne démontre pas la différence. Cependant, supposons Bird déclare une méthode Fly qui n'existe pas sur Animal. Vous ne seriez pas en mesure de le faire:

Animal* a = new Bird; 
a->Fly(); 

d'autre part, cela est légal:

Bird* b = new Bird; 
b->Fly(); 

La distinction est ici en raison du fait que C++ est un langage statiquement typé. Le type statique de la variable est ce à quoi le compilateur se soucie lorsqu'il vérifie des choses comme des appels de méthodes. Puisque le type statique de la variable a est Animal qui n'a pas de méthode Fly, le compilateur ne vous permettra pas d'appeler Fly dessus (tous les animaux ne peuvent pas voler, donc vous devrez explicitement transtyper à Bird: dynamic_cast<Bird*>(a)->Fly() est légal). L'expression new Bird aura le type Bird*. Si vous affectez une valeur d'un type dérivé à une variable d'un type basé, le compilateur ne se plaindra pas (tous Bird s sont Animal s, donc cela devrait toujours fonctionner). Fondamentalement, le compilateur met à jour Bird* à Animal*. L'inverse n'est pas vrai. Pas tous Animal s sont Bird s, donc vous devrez prendre la responsabilité et faire le casting explicitement et dire au compilateur que je sais que l'objet est vraiment un Bird*. Seulement dans ce cas, le compilateur vous permettra d'utiliser des fonctionnalités spécifiques à Bird. Donc, en général, si vous avez besoin d'un membre spécifique Bird, vous devriez utiliser Bird* b = new Bird;.

+0

Je pense que je comprends. Un suivi pour le clarifier dans mon esprit: Animal * A = nouvel animal; Animal * B = nouveau Oiseau; Avec ces déclarations, y a-t-il une différence entre A et B? (question posée avant certaines éditions ci-dessus) – Jarred

+0

@Jarred: Oui, l'objet pointé par 'A' n'est pas vraiment un 'Bird' alors que l'objet pointé par' B' est toujours vraiment un 'Bird' et vous avez simplement décidé de ne pas vous en soucier au moment où il l'est (puisque votre fonction s'applique également à tous les animaux et ne repose sur rien de spécifique aux oiseaux). Comme 'B' est un' Bird', vous pouvez le redescendre avec succès vers 'Bird *' et utiliser des membres spécifiques 'Bird'. Lancer 'A' à' Bird * 'ne réussira pas. –

+0

Merci beaucoup pour vos réponses utiles. – Jarred

Questions connexes