3

クラスAに静的メンバー変数があり、クラスBはクラスAから派生しています。

class A
{
  public:
    A()
    {
      a = 3;
    }
    static int a;
};

int A::a = 0;

class B : public A
{
  public:
    B()
    {
      a = 4;        
    }
};

void main()
{
  A objA;
  cout << "Before:" << A::a;
  B obj;
  cout << endl << "After:" << A::a;
}
     

静的フィールドは継承されますか? 派生型オブジェクトが作成されると、基本型も作成されます。次の質問があります。

  1. 代わりにA::a私もアクセスできるのはobjA.aどうしてですか?静的変数は、そのクラスのオブジェクトを介してアクセスできません。

  2. 派生クラスに対しても新しい静的変数が作成される場合 (に固有class B)、なぜ静的変数を初期化する必要がないのclass Bですか?

  3. 次の出力が次のように表示されるのはなぜですか。

前:3

後:4

いつ前後に3を表示する予定ですか?

4

5 に答える 5

4

静的変数へのアクセスは継承されるものです。プライベート アクセスを持つ静的メンバーにはアクセスできないことに注意してください。これがprotectedキーワードの目的であるためです。

于 2013-05-08T17:09:29.993 に答える
3
  1. objA.a はありません。A::a が表示される内部 B() コンストラクターへのアクセスがあるため、単に "a" としてアクセスできます。

  2. B::a はメモリ内の同じアドレスを参照します。B::a の新しい静的変数はありません。これは &B::a を介して確認できるものと同じです。

  3. 3 と 3 になることは期待されていません。A::a 値を変更し、(2) のため、B::a と同じ変数です (つまり、B() コンストラクターは A::a を変更します)。

于 2013-05-08T17:14:49.743 に答える
0
  1. 静的変数は、そのクラスのオブジェクトを介してアクセスできます。なぜ彼らはそうではないでしょうか?
  2. 静的変数のコピーは 1 つだけです。別のクラスがそれを継承する場合、別のコピーではなく、同じ静的変数にのみアクセスできます。
  3. B::B()4 に変更されたため。 とA::aの両方が へのアクセスBA共有しますA::a
于 2013-05-08T17:14:19.417 に答える
0

静的メンバーは継承されますか?

基本クラスの静的メンバーは、派生クラスの静的メンバーでもあるという意味で、そうです。

iの代わりに にA::aもアクセスできるのはどうしてですかobjA.a。静的変数は、そのクラスのオブジェクトを介してアクセスできません。

それが言語の定義方法です。どちらも同等であり、オブジェクトのタイプを簡単に記述できない場合は、オブジェクト スタイルの方が便利です。

派生クラスに対しても新しい静的変数が作成される場合 (クラス B に固有)、クラス B の静的変数を初期化する必要がないのはなぜですか?

class に固有の新しい静的変数はありませんB。class には 1 つだけありAます。継承は、クラス内でもスコープが設定されることを意味しBます。しかしA::aB::a両方とも同じ変数を参照しています。

次の出力が [3,4] と表示されるのはなぜですか?

上で説明したように、変数は 1 つしかなく、 のコンストラクターはBそれを に設定し4ます。

于 2013-05-08T17:20:06.277 に答える