2011-10-23 120 views
0

當訪問說明符是私有的時,派生類函數甚至無法訪問基類的公共成員。但是我的派生類的函數'xyz'怎麼能叫'showofb'? 我甚至通過在C的構造函數中調用函數'showofb'來嘗試它。在這兩種情況下都可以使用。 它如何能夠調用函數'showofb'?派生類函數如何調用基類的函數?

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(); 
}  

回答

1

B::showofb()是公共職能。所以可以通過C來調用。如果修改B以使showofb保密,則C將不再能夠調用它。

私有繼承意味着B的所有公共和受保護成員由C繼承爲私有。因此C仍然可以呼叫B的公共和受保護成員,但是從C派生的任何類都將無法呼叫B的成員。

+0

@ Praetorian-非常感謝你。你的回答幫助我整理出來。 – sector

3

私有繼承繼承父級的公共成員作爲子級的私有成員。一個類可以調用它自己的或繼承的私有成員。

考慮一下:

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 - 我明白你的觀點。主要是非成員函數,'c1.showofb();'不會工作。但是它不應該能夠在成員函數中調用......就像'xyz();'就我而言。這怎麼可能? – sector

+2

@ user1001204'xyz()'是'C'的公共成員,爲什麼你不能從'main()'調用它? – Praetorian

0

user1001204,你似乎有一個錯誤的私人繼承的概念。通過私有繼承從類B繼承的類C意味着繼承關係對於使用類C的任何內容都是隱藏的。私有繼承不會隱藏類C本身內部的繼承關係。

+0

@ David-oh m對不起,但如果是這種情況,請你向我解釋這是什麼意思 - 派生類的成員函數不能訪問公共成員? – sector

+0

@ user1001204 - 如果從C類派生類Z - **派生類Z **將無法訪問'showofb'。因爲它的私密性在C. – littleadv

+0

@ littleadv-非常感謝你。我現在就知道了! – sector

相關問題