2016-09-13 2 views
-5
#include <iostream> 
using namespace std; 
class B 
{ 
    public: 
    int x; 
    void print() 
    { 
    cout<<x; 
    } 
}; 

class D:private B 
{ 
}; 

int main() 
{ 
    D d; 
    d.print(); 
} 

印刷方法にアクセスできないのはなぜですか? Bの印刷方法はDのプライベートプロパティになりますので、Dのオブジェクトを使用してアクセスする必要があります。 エラーは次のとおりです。プライベートに継承された派生クラスのオブジェクトは、基本クラスメンバ関数にアクセスできません。

'B'は 'D'のアクセス可能なベースではありません。

+4

プライベートはプライベートです。なぜあなたはprivateメンバー関数にアクセスできると思いますか?結局、非公開です。 – Rakete1111

+0

プライベートメンバー関数はクラス内でアクセスできませんか? – AlokI

+5

@ AlokI、あなたはクラス内でアクセスしていません。 –

答えて

2

プライベート継承は、基本クラスが派生クラスのメンバー関数内でのみアクセスできることを意味します。通常has-aの関係をモデル化する場合は、私的継承を使用します。is-itではなく、継承を使用します。ここには該当しません。main()で直接電話をしようとしています。これは、代わりに動作します:

#include <iostream> 

class B 
{ 
public: 
    int x{42}; 
    void print() 
    { 
     std::cout << x; 
    } 
}; 

class D: private B 
{ 
public: 
    void f() 
    { 
     print(); // can access the private one in B 
    } 
}; 

int main() 
{ 
    D d; 
    d.f(); 
} 

Live on Coliru

をあなたはもっとここでそれについて読むことができます。Difference between private, public, and protected inheritance

あるいは、@WhozCraigが述べたように、あなたがpublicセクションでusing声明を経由してアクセス権を変更することができますが派生クラスの:

using B::print; // now it is visible in the derived class 
+2

[またはを使用してそれを吸う](http://ideone.com/QqYjxS)。 – WhozCraig

+0

@WhozCraig本当に!ありがとうございました。 – vsoftco

+0

また、 'protected'を使うこともできます。 –

関連する問題