1
// inheritence experiment

#include"stdafx.h"
#include<iostream> 

using namespace std;

class base
{
private:
    int i;
};

class derived: public base
{
private:
    int j;
};

int main()
{
    cout << endl << sizeof(derived) << endl << sizeof(base);
    derived o1;
    base o2;
    cout << endl << sizeof(o1) << endl << sizeof(o2); 
}

私はこの出力を得ています:

8
4
8
4

なんでそうなの?基本クラスのプライベートデータメンバーは派生クラスに継承されないので、派生クラスとo1の両方のサイズで8バイトを取得するのはなぜですか?

4

5 に答える 5

9

プライベートメンバーは継承されます。派生クラスからそれらにアクセスすることはできません。

于 2012-05-24T18:31:41.727 に答える
3

プライベートメンバーは実際には派生クラスにあり、派生クラス内ではアクセスできません。privateキーワードは、基本クラスから派生したプログラマーが、基本クラスの機能を変更する可能性があるため、基本クラスの設計者が変更したくない値を変更できないようにするためのものです。

詳細な説明については、こちらをご覧ください

壊れやすい基本クラス

于 2012-05-24T18:34:51.297 に答える
2
class base {
public:
  base(int v) : m_value(v) { }
  int value() { return m_value; }
private:
  int m_value;
};

class derived : private base {
  derived(int v) : base(v) { }
  int value2() { return value(); }
};

int main()
{
  derived d(2);
  return d.value2();
}

プライベート基本クラスが値をどこかに格納しない場合、これがどのように機能すると思いますか?

「派生クラスに継承される」という言葉を選択すると、継承がどのように機能するかについて混乱していると思います。基本クラスのメンバーは、派生クラスに継承またはコピーれません。派生クラスには、完全な派生オブジェクト内のサブオブジェクトとして基本型のインスタンスが含まれているため、派生クラスは(通常)少なくともその基本クラスの合計と同じ大きさです。

このコードを考えてみましょう:

struct A {
private:
  int i;
};

struct B {
  int j;
};

struct derived : A, B {
  int k;
};

Aオブジェクトはメモリ内にとして配置され、int。も同様Bです。オブジェクトは、オブジェクトderivedとしてメモリ内に配置され、その後にオブジェクトが続き、その後にが続きます。これは、3つのシーケンスであることを意味します。基本クラスのメンバーがパブリックであるかプライベートであるかは、それに影響しません。ABintint

于 2012-05-24T20:36:25.597 に答える
1

もちろん、それらは継承されます-結局のところ、基本クラスの動作はおそらくそれらがそこにあることに依存します-、それらはアクセスできないだけです!

于 2012-05-24T18:32:22.940 に答える
0

基本クラスの継承されたメソッドは、引き続きプライベートメンバーを使用できます。彼らはそこにいなければなりません。

于 2012-05-24T18:32:19.697 に答える