L'heritage multiple, c une facilite d'un langage qui permet a un programmeur de faire heriter une classe de plusieurs autres classes (grosso modo).
Des problemes se posent lors d'heritage en diamant par ex :
A
/ \
B C
\ /
D
D se retrouve avec 2 copies des methodes et des attributs de A. (un en passant par B, un autre en passant par C).
La plupart des problemes lies a l'heritage multiple c'est lors de la generation de code C++.
Pour faire de l'objet en C, grosso modo ce qu'on fait, c inclure la structure de la classe de base dans la classe derivee. De cette maniere, puisque les offsets des attributs sont toujours les memes, on se pose pas de question.
Lorsque tu as un heritage en diamant, comment tu calcules les offsets pour acceder a tes attributs ? On s'en sort en faisant du padding (en mettant des espaces entre les donnees) et en gerant l'acces aux attributs grace a un tableau qui indique comment acceder a un attribut donne suivant le type, mais ca complique les choses, et surtout ca ralentit pas mal l'execution du programme. On a le meme genre de probleme avec les methodes.
Tout ca pour dire que l'heritage multiple ca peut servir, mais souvent on s'en sort beaucoup mieux en revoyant son arbre d'heritage pour enlever les heritages multiples : l'arbre en general devient plus clair (mais c'est bien sur), preuve en general d'une meilleure architecture.
Le polymorphisme, (plusieurs formes, y a des latinistes dans le coin ??) permet a un objet d'un type donne de se faire passer pour un autre objet, ce qui est hyper pratique.
Ex : Tu as un arbre d'heritage
Vehicule
| \
Voiture Camion
Ton code :
Vehicule myVehicule = new Voiture();
==> Tu fait passer ta Voiture pour un Vehicule (normal une voiture est un vehicule)
==> Du code ecrit pour un vehicule fonctionnera a la fois pour une voiture et pour un camion.
Mais lorsque tu "overloade" une methode, ca te permet de changer la methode que tu vas appeler de facon transparente.
Ex :
myVehicule.f()
Si myVehicule est une Voiture, ca va appeler la methode f de Voiture, si myVehicule est un Camion, ca va appeler la methode f de Camion, etc...
Bon, tout ca est assez succinct, si tu veux un bon bouquin (online) pour commencer a voir ce que c'est que l'OO, va voir http://www.ibiblio.org/pub/docs/books/eckel/(...) et recupere "Thinking in java".
Tous les langages orientes objet (OO) implementent le polymorphisme, et l'heritage simple. Certains implementent aussi l'heritage multiple (C++, autre ?) plus d'autres "features" (RTTI, genericite, Reflexion, polymorphisme de methode, exceptions, ...).
[^] # Re: Erreurs de C++
Posté par Epsos . En réponse à la dépêche C# et Java, une étude comparée. Évalué à 6.
Des problemes se posent lors d'heritage en diamant par ex :
A
/ \
B C
\ /
D
D se retrouve avec 2 copies des methodes et des attributs de A. (un en passant par B, un autre en passant par C).
La plupart des problemes lies a l'heritage multiple c'est lors de la generation de code C++.
Pour faire de l'objet en C, grosso modo ce qu'on fait, c inclure la structure de la classe de base dans la classe derivee. De cette maniere, puisque les offsets des attributs sont toujours les memes, on se pose pas de question.
struct Base
{
byte i; // offset 0
byte j; // offset 1
}
struct derivate
{
struct Base base; // sizeof(Base) => 2
byte k; // offset 2
}
Lorsque tu as un heritage en diamant, comment tu calcules les offsets pour acceder a tes attributs ? On s'en sort en faisant du padding (en mettant des espaces entre les donnees) et en gerant l'acces aux attributs grace a un tableau qui indique comment acceder a un attribut donne suivant le type, mais ca complique les choses, et surtout ca ralentit pas mal l'execution du programme. On a le meme genre de probleme avec les methodes.
Tout ca pour dire que l'heritage multiple ca peut servir, mais souvent on s'en sort beaucoup mieux en revoyant son arbre d'heritage pour enlever les heritages multiples : l'arbre en general devient plus clair (mais c'est bien sur), preuve en general d'une meilleure architecture.
Le polymorphisme, (plusieurs formes, y a des latinistes dans le coin ??) permet a un objet d'un type donne de se faire passer pour un autre objet, ce qui est hyper pratique.
Ex : Tu as un arbre d'heritage
Vehicule
| \
Voiture Camion
Ton code :
Vehicule myVehicule = new Voiture();
==> Tu fait passer ta Voiture pour un Vehicule (normal une voiture est un vehicule)
==> Du code ecrit pour un vehicule fonctionnera a la fois pour une voiture et pour un camion.
Mais lorsque tu "overloade" une methode, ca te permet de changer la methode que tu vas appeler de facon transparente.
Ex :
myVehicule.f()
Si myVehicule est une Voiture, ca va appeler la methode f de Voiture, si myVehicule est un Camion, ca va appeler la methode f de Camion, etc...
Bon, tout ca est assez succinct, si tu veux un bon bouquin (online) pour commencer a voir ce que c'est que l'OO, va voir http://www.ibiblio.org/pub/docs/books/eckel/(...) et recupere "Thinking in java".
Tous les langages orientes objet (OO) implementent le polymorphisme, et l'heritage simple. Certains implementent aussi l'heritage multiple (C++, autre ?) plus d'autres "features" (RTTI, genericite, Reflexion, polymorphisme de methode, exceptions, ...).