1
class base
{
  private:
  int a;
  };
class base2
{
  private:
  int b;
  };
class derived:public base,public base2
{
  private:
  int c;
  };
main()
{
  base b;
  derived d;
  cout<<size of(base)<<size of(base2)<<size of(derived);
}

int a と int b はプライベート変数であるため、派生クラスでは継承されません。したがって、出力は 4 4 4 である必要がありますが、出力は 4 4 12 です。なぜですか?

4

2 に答える 2

6

int aとはプライベート変数であるため、クラスint bで継承されませんderived

それは間違っています - もちろん、それらは継承されています。基本クラスのコードはそれらなしでは機能しません。derivedそれらに到達できないだけですがsizeof、派生クラスは変更されません。

あなたの例のこの拡張を考えてみましょう:

class base {
private:
    int a;
protected:
    base() : a(123) {}
    void showA() {cout << a << endl;}
};

class base2 {
private:
    int b;
protected:
    base2() : b(321) {}
    void showB() {cout << b << endl;}
};

class derived:public base,public base2 {
private:
    int c;
public:
    derived() : c (987) {}
    void show() {
        showA();
        showB();
        cout << c << endl;
    }
};

derivedクラスは と を読み取ったり変更aしたりすることはできませんbが、そのベースで対応する関数を呼び出すことにより、それらの値を表示できます。したがって、変数はそのままにしておく必要があります。そうしないと、メンバー関数showAshowBメンバー関数が機能しなくなります。

于 2013-10-05T07:56:15.130 に答える
0

private:メンバー フィールドのorprotected:または注釈は、可視性のみに影響します。public:しかし、フィールドはまだクラスにあります。

優れた C++ プログラミングの本を数日かけて読んでください。

于 2013-10-05T07:56:05.387 に答える