2010-09-28 7 views
41

Supposons que j'ai une base et classe dérivée:accès par défaut d'héritage de classe

class Base 
{ 
    public: 
    virtual void Do(); 
} 

class Derived:Base 
{ 
    public: 
    virtual void Do(); 
} 

int main() 
{ 
    Derived sth; 
    sth.Do(); // calls Derived::Do OK 
    sth.Base::Do(); // ERROR; not calls Based::Do 
} 

vu que je souhaite accéder à la base :: Do par dérivé. Je reçois une erreur de compilation comme « base de classe inaccessible » mais quand je déclare que Derive

class Derived: public Base 

cela fonctionne bien. J'ai lu l'accès héritage par défaut est public, alors pourquoi ai-je besoin de déclarer explicitement l'héritage public ici?

Répondre

30

Vous avez peut-être lu quelque chose d'incomplet ou de trompeur. Pour citer Bjarne Stroustrup de "The C++ Programming Language", quatrième Ed., P. 602:

Dans un class, les membres sont par défaut private; dans un struct, les membres sont par défaut public (§16.2.4).

Ceci est également valable pour les membres hérités sans spécificateur de niveau d'accès.

Une convention très répandue consiste à utiliser struct uniquement pour l'organisation de membres de données purs. Vous avez correctement utilisé un class pour modéliser et implémenter le comportement des objets.

+0

@Prasoon hors de son contexte, vous avez raison, mais le contexte établi par le titre et le code est clairement "class" et non "struct". –

+1

La downvote n'est pas à moi. Upvoted à contrepoids. :) –

9

Le niveau d'héritage par défaut (en l'absence d'un spécificateur d'accès pour une classe de base) pour class en C++ est privé. [Pour struct il est public]

class Derived:Base

Base est privé hérité de sorte que vous ne pouvez pas faire sth.Base::Do(); à l'intérieur main() parce Base::Do() est privé à l'intérieur Derived

97

à partir des documents standards, 11.2.2

En l'absence d'un spécificateur d'accès pour une classe de base, publique est présumée lorsque la classe dérivée est définie par la classe cléstruct et privé est supposé lorsque la classe est définie par la classe classe clé.

Ainsi, pour struct s la valeur par défaut est public et class es, la valeur par défaut est private ...

exemples de la documentation norme elle-même,

class D3 : B {/.../}; // B private by default

struct D6 : B {/.../}; // B public by default

+22

Cela devrait être la réponse. – Eloff

+0

Je vais le seconder. –

4

Le type par défaut de l'héritage est privé. Dans votre code,

Classe B:

est rien

classe B: privée A

Questions connexes