2011-10-23 5 views
0

La fonction de classe dérivée ne peut même pas accéder aux membres publics de la classe de base lorsque le spécificateur d'accès est privé. Mais comment se fait-il que la fonction 'xyz' de ma classe dérivée puisse appeler 'showofb'? Je l'ai même essayé en appelant la fonction 'showofb' dans le constructeur de C. Dans les deux cas cela fonctionne. Comment peut-il appeler la fonction 'showofb'?comment une fonction de classe dérivée peut-elle appeler une fonction de la classe de base?

class B 
{ 
    public: 
    B() 
    { 
     cout<<":B:"<<endl; 
    } 
    void showofb() 
    { 
     cout<<"show of b"<<endl; 
    } 
}; 

class C : private B 
{ 
public: 
    C() 
    { 
     cout<<":C:"<<endl; 
    } 
    void xyz() 
    { 
     showofb(); 
    } 
}; 

int main() 
{ 
    C c1; 
    c1.xyz(); 
}  

Répondre

1

B::showofb() est une fonction publique. Donc, il peut être appelé par C. Si vous modifiez B pour rendre showofb privé, C ne pourra plus l'appeler.

L'héritage privé signifie que tous les membres publics et protégés de B sont hérités en tant que private par C. Ainsi, C peut toujours appeler les membres publics et protégés de B, mais toutes les classes dérivées de C ne pourront pas appeler les membres de B.

+0

@ Praetorian-merci beaucoup. Votre réponse m'a aidé à le régler. – sector

3

L'héritage privé hérite des membres publics du parent en tant que membres privés de l'enfant. Une classe peut appeler ses propres membres privés ou hérités.

Considérez ceci:

class B 
{ 
    public: 
    B() 
    { 
     cout<<":B:"<<endl; 
    } 
    void showofb() 
    { 
     cout<<"show of b"<<endl; 
    } 
}; 
class C : private B 
{ 
public: 
C() {} 
}; 
class D : public B 
{ 
public: 
    D(){}; 
} 
int main() 
{ 
    C c1; 
    c1.showofb(); // WONT WORK 
    D d1; 
    d1.showofb(); // WILL WORK 
}  
+0

@ littleadv-je comprends votre point. main étant une fonction non-membre, 'c1.showofb();' ne fonctionnera pas. Mais il ne devrait pas être capable d'appeler même dans une fonction membre droite ... comme 'xyz();' dans mon cas. Comment est-ce possible? – sector

+2

@ user1001204 'xyz()' est un membre public de 'C', pourquoi ne serais-tu pas capable de l'appeler depuis' main() '? – Praetorian

0

user1001204, vous semblez avoir un concept erroné d'héritage privé. Cette classe C hérite de la classe B via l'héritage privé signifie que la relation d'héritage est cachée à tout ce qui utilise la classe C. L'héritage privé ne masque pas la relation d'héritage à l'intérieur de la classe C elle-même.

+0

@ David-oh m désolé mais si c'est le cas pouvez-vous s'il vous plaît m'expliquer ce que cela signifie par -member fonctions de la classe dérivée ne peut pas accéder aux membres du public »? – sector

+0

@ user1001204 - Si vous dérivez la classe Z de la classe C - ** la classe dérivée Z ** n'aura pas accès à 'showofb'. Parce que son privé dans C. – littleadv

+0

@ littleadv-merci beaucoup. Je l'ai eu maintenant! – sector

Questions connexes