Bonjour
Je ne comprends pas pourquoi il n'est pas possible de convertir un objet d'une classe dérivée secondaire en une classe de base, lorsque cette classe dérivée secondaire hérite d'une classe dérivée primaire (qui elle-même hérite directement de la classe de base).
Je m'explique avec un exemple:
On a une classe B qui hérite de manière privée de A, et une classe C qui hérite de manière public de B.
On voit qu'il n'y a pas d'erreur avec la première fonction f(), mais il y a une erreur avec la fonction f de la classe C.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 class A{ private: int o; public: A(int u):o(u){} int g(){ return 1; } }; class B:private A{ private: int i; public: B(int f,int k):A(k),i(f){} int f(int o){ this->g(); }; }; class C:public B{ private: int i; public: //ctor pas défini ici. int f(int o){ (this)->g(); }; };
Pourtant il est parfaitement possible de convertir un objet de la classe dérivée B en un objet de la classe dérivée A bien que l'héritage soit privé.
Il est possible de convertir un objet de la classe dérivée C en un objet de la classe dérivée B, l'héritage étant public.
Mais il n'y a pas de transitivité? Il n'est pas possible de convertir un objet C en un objet A.
Que pourrait faire un dynamic_cast?
De plus, j'ai cru comprendre que l'héritage privé signifiait qu'un objet d'une classe dérivée n'était pas du tout du type de la classe de base, mais ne pouvait profiter uniquement de l'implémentation.
Or, la conversion n'est-elle pas contradictoire avec ce qui vient d'être dit, car l'objet converti sera en quelque sorte un objet de la classe de base.
Je vous remercie
Pierre
Partager