C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Héritage multiple

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
PurL
Guest





PostPosted: Wed Nov 10, 2004 3:46 pm    Post subject: Héritage multiple Reply with quote



Bonjour,

Pouvez-vous m'expliquer ceci :

J'ai 2 classes de bases où, dans leur constructeur respectif, j'affiche
l'adresse de l'objet qui est en train d'etre instancié :

class Base1
{
public:
Base1()
{
cout << "Base1 = " << (long)this << endl;
}
};

class Base2
{
public:
Base2()
{
cout << "Base2 = " << (long)this << endl;
}
};

et une classe enfant :

class MaClasse : public Base1, public Base2
{
public:
MaClasse()
{
cout << "MaClasse = " << (long)this << endl;
}
};

où j'afiche aussi l'adresse de l'objet qui est en train d'être instancié.

Dans le Main, quand je fais MaClasse monobjet, j'ai à l'affichage :

Base1 = addr1
Base2 = addr2
MaClasse = addr1

Pourquoi ai-je 2 adresses différentes ? normalement l'appel de ces 3
constructeurs correspond à la construction d'un seul objet (monobjet) !
Base2 devrait aussi affiché addr1 ? à quoi correspond add2 ?

Merci de vos éclaircissement,

PurL


Back to top
Rémy
Guest





PostPosted: Wed Nov 10, 2004 5:33 pm    Post subject: Re: Héritage multiple Reply with quote




"PurL" <purl-nospam (AT) chez (DOT) com> a écrit dans le message de
news:419237b1$0$9824$8fcfb975 (AT) news (DOT) wanadoo.fr...
Quote:
Bonjour,

Pouvez-vous m'expliquer ceci :

J'ai 2 classes de bases où, dans leur constructeur respectif, j'affiche
l'adresse de l'objet qui est en train d'etre instancié :

class Base1
{
public:
Base1()
{
cout << "Base1 = " << (long)this << endl;
}
};

class Base2
{
public:
Base2()
{
cout << "Base2 = " << (long)this << endl;
}
};

et une classe enfant :

class MaClasse : public Base1, public Base2
{
public:
MaClasse()
{
cout << "MaClasse = " << (long)this << endl;
}
};

où j'afiche aussi l'adresse de l'objet qui est en train d'être instancié.

Dans le Main, quand je fais MaClasse monobjet, j'ai à l'affichage :

Base1 = addr1
Base2 = addr2
MaClasse = addr1

Pourquoi ai-je 2 adresses différentes ? normalement l'appel de ces 3
constructeurs correspond à la construction d'un seul objet (monobjet) !
Base2 devrait aussi affiché addr1 ? à quoi correspond add2 ?

Merci de vos éclaircissement,

PurL



Bonjour,

Le compilateur a besoin d'adresses mémoire pour stocker les attributs
correspondant aux différents héritages (et aussi pour les méthodes
virtuelles, mais n'en parlons pas pour simplifier). On peut imaginer que le
votre organise les informations de la façon suivante:

addr -> Attributs de monobjet ne provenant ni de Base1, ni de Base2
addr1 -> Attributs de monobjet provenant de l'héritage de Base1
addr2 -> Attributs de monobjet provenant de l'héritage de Base2
addr3 -> Fin de monobjet

Les données de monobjet sont stockées entre addr et addr3, mais lorsque le
constructeur de Base1 est appelé, on lui passe addr1, lorsque celui de Base2
est appelé, on lui passe addr2. Pour faire différemment (passer addr à tous
les constructeurs), il faudrait un moyen pour que chaque constructeur "retro
uve" les données sur lesquelles il doit travailler.

Si MaClasse n'ajoute pas d'attributs (ni de méthode virtuelle) par rapport à
Base1 et Base2, on peut alors avoir addr==addr1.
C'est aussi le cas si les données propres à MaClasse sont placées après
celles provenant des héritages.

Rémy



Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Nov 12, 2004 7:58 am    Post subject: Re: Héritage multiple Reply with quote



"PurL" <purl-nospam (AT) chez (DOT) com> wrote


Quote:
Pouvez-vous m'expliquer ceci :

J'ai 2 classes de bases où, dans leur constructeur respectif, j'affiche
l'adresse de l'objet qui est en train d'etre instancié :

class Base1
{
public:
Base1()
{
cout << "Base1 = " << (long)this << endl;
}
};

class Base2
{
public:
Base2()
{
cout << "Base2 = " << (long)this << endl;
}
};

et une classe enfant :

class MaClasse : public Base1, public Base2
{
public:
MaClasse()
{
cout << "MaClasse = " << (long)this << endl;
}
};

où j'afiche aussi l'adresse de l'objet qui est en train d'être
instancié.

Dans le Main, quand je fais MaClasse monobjet, j'ai à l'affichage :

Base1 = addr1
Base2 = addr2
MaClasse = addr1

Pourquoi ai-je 2 adresses différentes ? normalement l'appel de ces 3
constructeurs correspond à la construction d'un seul objet (monobjet) !
Base2 devrait aussi affiché addr1 ? à quoi correspond add2 ?

Les constructeurs sont passés l'adresse du sous-objet qu'il doit
construire, et non l'adresse de l'objet complet. Si tu y refléchis un
peu, tu te rendras compte qu'il ne peut pas en être autrement -- dans
ton code, par exemple, le constructeur de Base2 ne sait pas qu'il doit
construire un Base2 qui est classe de base de MaClasse. Il ne pourrait
donc rien faire avec l'adresse de l'objet complet.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.