1

Win8 VC++2012 を使用しています。

上記のコードは、子クラス B がいかなる状況下でも A::a にアクセスできないことを示しています。A::a のアクセス属性も変更できませんが、A::b と A::c は変更できません。

したがって、A::c は A から B に継承されません。しかし、sizeof(A) と sizeof(B) はそれぞれ 12 と 24 です。これは、A::a DO が B のメモリを占有していることを意味します。

  1. A::a をメモリに格納する方法
  2. 本 C++ Primer によると、基本クラスメンバーのアクセス属性を復元できますが、それを変更することはできません。ここで私のコードは、B で A::b のアクセス属性を protected から public に変更できることを示しています。なぜですか?

コードは次のとおりです。

#include <iostream>
using namespace std;

class A
{
private:
    int a;
protected:
    int b;
public:
    int c;

    A(int a, int b, int c): a(a), b(b), c(c)
    {
        cout << "A: ";
        cout << a << " ";
        cout << b << " ";
        cout << c << endl;
    }
};

class B: protected A
{
private:
    int d;
protected:
    int e;
    //using A::a; COMPILE ERROR
public:
    int f;
    //A::a;  COMPILE ERROR
    using A::c; //RESTORE A::c public access
    A::b; // change A::b from protected to public

    B(int d, int e, int f): A(d, e, f), d(d), e(e), f(f)
    {
        cout << "B\n";
        //cout << a << endl; COMPILE ERROR
        cout << b << " ";
        cout << c << " ";
        cout << d << " ";
        cout << e << " ";
        cout << f << endl;
    }
};
int main()
{
    A a(1,2,3);
    B b(4,5,6);

    cout << "sizeof(A)=" << sizeof(A) << endl; //OUTPUT 12
    cout << "sizeof(B)=" << sizeof(B) << endl; //OUTPUT 24
    return 0;
}
4

4 に答える 4

6

子は親のプライベート メンバーを継承しますが、アクセスすることはできません。アクセスするには、それらを作成しますprotected

class A
{
protected: // <<------------ make `a` as protected in parent
    int a;
于 2013-04-18T13:13:06.690 に答える
1

したがって、A::c は A から B に継承されません。

もしかして

したがって、A::a は A から B に継承されません。

しかしそれでも、それは確かに受け継がれています。直接アクセスできないだけです。ただしB、まだa.

なぜこれが必要なのですか?の値を設定または取得できるpublic メソッドを にAa含めることができるためですこれらの関数は、B 自身へのアクセスをa間接的に与えることができます。

例えば

class A {
private:
    int a;      // a is private
public:
    void set_a(int i) {a = i;}
};

class B : protected A {
public:
    using A::set_a;   // we bring set_a to public access
};

int main() {
    B b;
    b.set_a(2);   // change b.a indirectly
    b.a = 2;      // Error
}
于 2013-04-18T13:14:39.157 に答える
1

継承を使用すると、派生クラスのインスタンスと共に基本クラスのインスタンスが作成されます。基本クラス内のすべてのメンバーは、派生クラスにアクセスできない場合でも、派生クラスをインスタンス化するときに構築されます。

メンバーを基本クラスでプライベートにする必要があるが、派生クラスでアクセスしたい場合。プライベート メンバーへのアクセスを許可する保護されたアクセサーを基本クラスに作成します。

 protected:    
 int &geta() { return a; }
于 2013-04-18T13:13:50.270 に答える
0

問題が何であるかわかりません:

B は A です。そのため、B がアクセスできない場合でも、a 属性によって占有されるスペースが存在します。

a を返す public メソッド geta() があった場合、 a が B にない場合、どのように a を返すことができますか?

于 2013-04-18T13:16:41.093 に答える