2011-10-23 5 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のpublicメンバーとprotectedメンバーを呼び出すことができますが、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-私はあなたの意見を得ます。 mainは非メンバ関数で、 'c1.showofb();'は動作しません。しかし、私の場合は 'xyz();のようなメンバー関数でも呼び出すことはできません。どのように可能ですか? – sector

+2

@ user1001204 'xyz()'は 'C'のパブリックメンバーです。どうして' main() 'から呼び出せないのですか? – Praetorian

0

user1001204、あなたは私的継承という誤った概念を持っているようです。そのクラスCは、クラスBからプライベート継承を継承し、継承関係がクラスCを使用するものに隠されることを意味します。プライベート継承は、クラスC内部の継承関係を隠蔽しません。

+0

@ David-oh m申し訳ありませんが、その場合、派生クラスのメンバ関数が公開メンバーにアクセスできないことを私に説明してください。 – sector

+0

@ user1001204 - クラスC - **からクラスZを派生した場合、派生クラスZ **は 'showofb'へのアクセス権を持ちません。 C.のプライベートなので – littleadv

+0

@ littleadv - 非常にありがとう。私は今それを得た! – sector