Quelqu'un pour m'aider en C++??

Fermé
Dauphinline Messages postés 2 Date d'inscription vendredi 5 janvier 2007 Statut Membre Dernière intervention 18 février 2007 - 5 janv. 2007 à 19:36
 didou - 7 janv. 2007 à 23:41
Bonjour tout le monde


J'aurais besoin de vos lumières, je suis novice en C++ et il y a quelques petites choses que je ne comprends pas!!
On me demande quel est le lien entre la fonction DeleteContents du document d'une application et la fonction DeleteContents de la classe CDocument. Moi je répondrais que c'est sa dérivée mais je ne suis pas sure...

On me demande aussi pourquoi la fonction DeleteContents est une fonction virtuelle et là je ne comprends pas malgrès le fait que j'ai appris mon cours!

Y a t il quelqu'un pour m'aider. Je vous remercie d'avance

2 réponses

Salut,

je préfère dire que la fonction DeleteContents du document de l'application est une redefinition de la fonction DeleteContents de la classe CDocument plutôt que sa dérivée ( ceci dit c'est peut-être un abus de language qui est entré dans le jargon de la programmation objet). J'ai appris plutôt à dire que la classe qui redéfinit cette fonction DeleteContents (celle de la ou les appications qui utilisent la classe CDocument ) est une classe dérivée de CDocument.

(Entre parenthèses: D'après ce que semble suggerer l'énoncé de ton problème, CDocument doit être une classe qui ne peut pas être utilisée telle quelle parce que pas totalement définie : certaines méthodes doivent être purement virtuelles ( syntaxe de leur déclaration en C++ : virtual <type retour> nom_méthode(<arg>, ....)=0; -- et pas de définition dans la classe mère puisque la déclaration se termine par '=0'). Dans dans d'autres langages orientés objet comme Eiffel, on dirait que la méthode est dite différée (comprendre que sa définition ( ou son corps ) est différée dans les classes filles. On dit aussi que la classe mère en question est abstraite en C++ et en Java)

pour le second volet de ta question:

le mot-clé virtual permet d'activer l'appel dynamique de méthode.

Pour m'expliquer, reprenons l'exemple de CDocument et de sa méthode DeleteContents.

Je ne sais pas ce que fait DeleteContents dans CDocument si encore elle peut être définie dans CDocument (si non, elle doit être vituelle pure ).

Imagine qu'une autre méthode de CDocument, appellons-la CDocument::destroy (j'invente) réalise un certains nombre d'actions pour libérer toutes ses structures en mémoire et pour cela fait entre autre appel à CDocument::DeleteContents :

class CDocument {
void destroy()
{
// ...
CDocument::DeleteContents();
/...
}


Jusque-là tout va bien.

Dérivons à présent CDocument et redefinissons deleteContents() pour des besoins plus spécifiques de la classe dérivée, la classe des formulaires, par exemple:

class CFormulaire :public CDocument
{
// ...
void deleteContents(void)
{
/...
}
}

Par contre, on suppose que CDocument::destroy n'a pas besoin d'être redéfinie. C'est aussi et surtout ça la force de la programmation objet : la réutilisation de code. L'informatien est peut-être intelligent parce-que paresseux :).

1er cas : CDocument::DeleteContents n'est pas virtuelle.


quelle méthode deleteContents(void), destroy() fera appel dans la classe fille, CFormulaire ?
Est-ce CDocument::deleteContents(void) ou CFormulaire::deleteContents(void) ?

Réponse : ce sera CDocument::deleteContents(void) qui sera appelé dans destroy() de la classe CFormulaire.
Pourquoi : parce-que je rappelle que destroy n'a pa été redéfinie dans CFormulaire et c'est le corps de CDocument::destroy qui est exécuté en vérité (pourquoi le compilateur dupliquerait du code dans la classe fille, pour quel bénéfice ?).
L'appel à deleteContents(void) est statique : c'est l'adresse de la méthode CDocument::deleteContents() qui est appelée "en dur" dans le corps de CFormulaire::destroy().

Est-ce le comportment que l'on désire ? Sûrement pas la plupart du temps et même quasiment tout le temps d'ailleurs le langage java ne permet pas un tel choix. Toutes les méthodes sont virtuelles.

2eme cas : CDocument::DeleteContents est virtuelle.

Tu le devines, c'est le cas qui résoud notre problème.

Mécanisme supplémentaire introduit à la compilation de CDocument :

Car en effet, notre gentil compilateur C++ va alors mettre en place un petit mécanisme comprenant une table d'adressage de méthodes virtuelles de la classe CDocument qui pemettra de conserver en permance à la fois l'adresse d'appel de la méthode CDocument::deleteContents() et CFormulaire::deleteContents().

Selon qu'une instance est de type CDocument ou CFormulaire, un pointeur indiquera les bonnes adresses d'appel (respectivement celles des méthodes virtuelles de CDocument, celles de CFormulaire ).

Et pour finir, en non moins le plus important, dans le corps de la méthode destroy, le compilateur ajoutera le code nécessaire pour prendre en compte cette table et le pointeur pour désigner et appeler la bonne méthode deleteContents selon que l'instance et de type CDocument ou CFormulaire : c'est la mise en place de l'appel dynamique de méthode virtuelle.

J'espère avoir été clair et précis.

A bientôt, peut-être.
Didier.
1
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
7 janv. 2007 à 14:14
Une fonction est virtuelle si elle est réimplémentable dans une classe fille. Pour la première question sans le code ou la doc on ne peut pas répondre. Vu la syntaxe je suppose que c'est des classes MFC mais je ne les connais pas, car je n'utilise pas ces choses...

Bonne chance
0