1
#include <iostream>
using namespace std;

class base{
public:
    int i;
    base(){
    i=1;
    cout<<"Base Constructor";
    }
};

class derived: private base{
    public:
    derived(){
    i=2;
    cout<<"Derived constructor";
    }
};


int main(){ 
derived c;
return 0;
}

上記のコードの場合、privateを使用して継承したのに、なぜ「BaseConstructorDerivedConstructor」として出力を取得するのですか?

4

3 に答える 3

3

なぜまだmain関数からアクセスできるのですか?

あなたは違います。

main関数はderived、アクセスできるのコンストラクターにアクセスします。

そして、derivedのコンストラクターは、アクセスできるbaseコンストラクターにアクセスします。

于 2013-02-23T16:54:54.587 に答える
1

コンストラクターは、コンストラクターの本体を実行する前に、基本クラスとメンバーを自動的に初期化します。プライベート継承はそれを変更しません。クラスの基本部分にクラス外からアクセスできないようにするだけです。基本クラスコンストラクターを呼び出しているのは派生クラスコンストラクターであるため、プライベート継承は実行できることを制限しません。

于 2013-02-23T16:49:08.330 に答える
0

つまり、基本クラスのコンストラクターを作成しますprotected。その場合、派生クラスのみがそれを使用できます。

class base
{
protected:
    base() : i(1) { }
private:
    int i;
};

class derived : private base
{
public:
    derived() : base() { }
};

int main()
{ 
    // base b;  // error: inaccessible constructor base::base()
    derived d;  // fine
}

やや人気のあるパターンは、デストラクタを保護することでもあります。しかし、あなたは要点を理解します。

于 2013-02-23T16:50:46.030 に答える