2010-05-11 5 views
0

Je suis un peu confus:les classes enfants C++ dactylographie et POO

  • Si j'ai une classe de base A, et une classe B qui extends A, peut une variable du type A maintenir une valeur de type B et vice versa?

Si oui, pourquoi? Ne sont-ils pas complètement différents même si B est dérivé de A? Que diriez-vous de la sécurité de type?

  • Si cela est possible, à quoi dois-je faire attention lorsque je m'en occupe? Comment cela fonctionnerait-il en termes de performance?

Note: Désolé si je posais trop de questions, les ignorer et il suffit de regarder pour les « marqué » avec le point de la décoration de la liste :) En outre, ce n'est pas mes devoirs. Je suis un programmeur de passe-temps et j'ai des compétences dans les langages de script avec OOP, mais je suis relativement nouveau dans la typographie OOP en C++.

+0

peut-être fournir un code comme un exemple :) –

+1

Pourquoi? Je n'ai pas d'exemples concrets pour le moment. La règle selon laquelle les classes enfants "ont le même type que" leurs classes père devrait être générale, ou? – Zack

+0

Ne pas avoir des exemples concrets est pourquoi vous êtes confus. Codez quelque chose et cela vous aidera à comprendre tout cela. – jmucchiello

Répondre

3

Si vous faites ceci:

B b; 
A a = b; 

vous obtenez "trancher". a contiendra seulement la partie A de b.

Mais vous pouvez avoir des références/pointeurs:

B b; 
A &ra = b; 
A *pa = &b; 

Dans ce cas, ra et pa simplement se référer/point de l'objet réel B. C'est parce que l'héritage public modélise une relation IS-A. C'est plus facile à comprendre avec des noms plus descriptifs. Pensez à A et Animal et B comme Baboon. Un Baboon IS-A Animal donc en utilisant des références/pointeurs, vous pouvez traiter Baboon comme il est de type Animal plus générique.

+0

Pourriez-vous expliquer comment et pourquoi cela fonctionne avec des pointeurs? Pourquoi C++ ne pleure-t-il pas une erreur de frappe? Je veux dire A! = B, ou? – Zack

+1

'A' et' B' sont des types, pas des objets (contrairement à de nombreuses autres langues où les types sont des objets). Avec des pointeurs, un 'A *' peut faire référence à tout ce qui est dérivé de A, et les fonctions virtuelles seront correctement transférées à l'implémentation de la classe dérivée. Par exemple. 'Animal * animal = nouveau babouin(); animal-> Mangez(); animal-> Sleep(); 'appellera les méthodes Eat et Sleep de la classe Baboon si elles sont virtuelles (dans Animal) et remplacées dans Baboon. OTOH, si vous avez fait 'animal a = Babouin()', un babouin va se créer, mais * * et vous tranché serez à gauche avec un animal valide qui ne contient rien supplémentaire de babouin. –

0

Une variable de type A peut contenir une valeur de type B (pour certaines définitions de "tenir", comme d'autres réponses expliquent), mais certainement pas vice-versa. Pour sortir un exemple type:

class Animal {}; 
class Dog : public Animal {}; 
class Cat : public Animal {}; 

C'est légal, car Cat dérive de Animal:

Cat c; 
Animal& a = c; 

Ce n'est pas:

Animal a; 
Cat& c = a; 

C'est de type sécurisé parce que vous l'ai défini comme tel; le point entier de l'héritage est de permettre ce genre de chose arriver, afin que vous puissiez continuer à appeler des méthodes sur une variable Animal générique sans savoir quelle classe de base se trouve être stockée. Quant à la question de la performance, en appelant des méthodes virtuelles est plus lente, car décider quelle méthode sera effectivement appelé (Cat::foo() contre Dog::foo(), par exemple, en fonction du type de Animal stocké dans la variable) doit se produire lors de l'exécution - c'est appelé répartition dynamique.Avec des méthodes non virtuelles la décision peut se produire au moment de la compilation

+1

en C++ la variable que vous attribuez aux besoins d'une référence (votre code compilera, mais il ne fonctionnera pas comme prévu). Le code devrait être 'Cat c; Animal & a = c; 'et' Animal a; Cat & c = a; '. Voir les autres réponses –

+0

C'est peut-être légal mais ce n'est pas très utile. Comme l'a dit Ken, utilisez des références (ou des pointeurs). – jmucchiello

0

Un pointeur ou référence à un objet de la classe A peut pointer/faire référence à un objet de la classe B. En effet, si B dérive de A, puis un Best-unA. Chaque objet de la classe B a toutes les variables membres et des fonctions de classe A, ainsi que celles qui sont propres à B. Habituellement, ce type de code est utilisé lorsque vous voulez utiliser le comportement polymorphe à travers des fonctions virtuelles.

0

pas contraire, mais la performance n'est pas la bonne question ici. Si vous avez décidé d'effectuer une conception OO, ne sacrifiez pas l'abstraction correcte pour des problèmes de performances. L'optimisation prématurée est la racine de tout Mal. Bonne chance!

Questions connexes