2009-08-31 7 views
2

J'ai un petit problème avec mon compilateur (VC++ 6.0). À mon avis, un tel code devrait provoquer une erreur;typedef privé visible dans la classe dérivée

class Base 
{ 
    private: 
     typedef int T; 
}; 

class Derived : private Base // Here the Base class can be inherited publicly as well. It does not play any role 
{ 
    public: 
     T z; 
}; 



int main() 
{ 
    Derived obj; 
    obj.z = 7; 
    return 0; 
} 

Cet extrait de code est compilé et exécuté sous VC++ 6.0 sans aucun problème. En ce qui concerne SW-Design, ce code n'est pas parfait pour ce qui est du code

Aucun membre de la classe ne devrait être déclaré public. Mais je ne suis pas intéressé par cet aspect.

Mon problème est avec typedef. Le typedef est déclaré dans la classe Base comme privé. De mon point de compréhension C++, ce typedef ne doit pas être visible à la classe Derived ou à la fonction main(). Mais les deux les voient parfaitement.

Quelqu'un at-il une explication à ce phénomène?

Merci à l'avance

Necip

+0

J'ai essayé de le compiler avec VS 2008 - impossible d'accéder à un typedef privé déclaré dans la classe Base. Il est intéressant de savoir pourquoi il est correct dans VS 6 –

+3

VC6 a de nombreux problèmes de non-conformité à la norme. –

+0

@Svetlozar, VC++ 6.0 est vieux, précède même la publication standard IIRC. Comme d'habitude, les raisons de non-conformité vont des anachronismes - le langage a changé - aux bugs passant par des extensions et le résultat de résolutions différentes de celles des bogues standards. – AProgrammer

Répondre

7

Ce comportement est une non-conformité dans VC++ 6.0, vous devez avoir obtenu une erreur lors de la définition Derived :: z. (Sauf si vous avez des raisons professionnelles de l'utiliser, il y a d'autres choix techniquement préférable à VC++ 6.0 qui est ancien).

Questions connexes