Heritage Privé comprehension
BOn alors voila mon probleme :
Apres avoir lu des docs sur l'heritage de classe, j ai du mal a comprendre la specificité du l heritage privé :
Jdonne un exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
class Carré{
public :
void dessine();
};
Class SommetArbre : private Carre {
public :
void affiche () { Carre :: dessine() } // vu QUE nous sommes private cette ligne est interdite ?
}; |
est ce que dans n importe quel endroit du code on peut convertir des sommets Arbre en Carre?
Dans n'importe qu elle endroit du code on peut ecrire SommetArbre sa; sa.dessine()?
Dans l'implementation de Sommetsarbre on peut convertir des SOmmets ARbres en Carre?
A quel moment un heritage privé est il justifié ?
Merci d avance
Edit : desole pour les balises ...
Re: Heritage Privé comprehension
Citation:
Envoyé par s3r3nity
BOn alors voila mon probleme :
Apres avoir lu des docs sur l'heritage de classe, j ai du mal a comprendre la specificité du l heritage privé :
Jdonne un exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
class Carré{
public :
void dessine();
};
Class SommetArbre : private Carre {
public :
void affiche () { Carre :: dessine() } // vu QUE nous sommes private cette ligne est interdite ?
}; |
Pas de problème : Quand on dérive en privé, on peut appeler toutes les fonctions publiques depuis l'implémentation de la classe.
Citation:
Envoyé par s3r3nity
est ce que dans n importe quel endroit du code on peut convertir des sommets Arbre en Carre?
Non : L'héritage privé ne permet pas la conversion.
Citation:
Envoyé par s3r3nity
Dans n'importe qu elle endroit du code on peut ecrire SommetArbre sa; sa.dessine()?
Non : Les fonctions de Carré sont comme si elles étaient déclarées privées dans SommetArbre
Citation:
Envoyé par s3r3nity
Dans l'implementation de Sommetsarbre on peut convertir des SOmmets ARbres en Carre?
Non.
Citation:
Envoyé par s3r3nity
A quel moment un heritage privé est il justifié ?
Rarement.
L'héritage privé est une alternative à l'aggragation, et non pas à l'héritage. Elle peut avoir une intérêt sur l'aggrégation dans deux cas :
- Si avant d'aggréger, on a besoin de redéfinir quelques fonctions virtuelles. L'alternative étant de faire de l'héritage public pour redéfinir ces fonctions, puis d'aggréger la classe obtenue. En faisant ainsi, on évite l'intermédiaire (bof).
- Pour optimiser la consommation mémoire d'une classe quand la classe de base est vide (voir empty base classe optimisation pour plus d'info).