Voici un cas tordu que j'ai rencontré récemment (sous Visual Studio 2008 v9.0) et qui me dérange un peu :
- ((B*)inst)->f(); ne compile pas car f() de B est protected (ou private): logique.
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 class A { public: virtual f(); }; class B:public A { protected: (ou private:) virtual f(); }; main() { A* inst = new B(); ((B*)inst)->f(); inst->f(); }
- inst->f(); compile car f() de A est public : logique. A l'exécution, c'est en fait f() de B qui est appelé : toujours logique, polymorphisme oblige. Mon problème est que f() de B est protected (ou private) et ne devrait pas être appelable depuis une fonction extérieure à B.
1- Est-ce que modifier la visibilité d'une fonction virtuelle dans les classes dérivées est réellement légale ?
2- Est-ce que ce comportement est normal ?
3- Est-ce que je ne risque pas un comportement aléatoire en fonction du compilo et de l'environnement en général ?
Partager