Accès à une méthode virtuelle protégée ou privée
Voici un cas tordu que j'ai rencontré récemment (sous Visual Studio 2008 v9.0) et qui me dérange un peu :
Code:
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();
} |
- ((B*)inst)->f(); ne compile pas car f() de B est protected (ou private): logique.
- 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 ?