Bonjour,
j'ai une question qui me turlupine. Un de mes collègues a fait le test suivant :
Et... ça compile !!
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 class cA { public: cA(std::string _caller = "defaut") { std::cout << "cA construit par " << _caller.c_str() << std::endl; } }; class cB : private virtual cA { public: cB():cA("cB"){} }; class cC : private virtual cA { public: cC(){} }; class cD : public cB, public cC { public: cD():cB::cA("cD") {} };
Et si l'on enlève le fait que l'héritage soit virtuel entre cA et cB et cC, alors ça ne compile plus puisque le ctor de cA passe privé dans cB et est donc inaccessible dans cD.
On suppose donc que le virtual rend automatiquement l'héritage public ou protected ?
Et vous me direz surement que ça n'a pas de sens de faire un héritage privé virtuel puisque le virtuel est là pour éviter que les attributs de cA soient en double dans cD, et donc avec un héritage privé ils ne seront même pas accessibles dans cD.
C'est vrai, mais on se demandait juste ce qu'avait prévu la norme dans ce cas bizarroïde...
Merci d'avance pour vos lumières.
Partager