4

私は約20分間プログラムをいじっていましたが、何らかの理由で初期化リストで継承された変数を使用できないことがわかりました。このプログラムの例:

class A {
protected:
        int i;
};

class B : public A {
public:
        B() : i(45) { }
};

int main() {
        B b;
}

エラーが発生します

エラー:クラス「B」には「i」という名前のフィールドがありません</ p>

ただし、コンストラクターを次のように変更すると、次のようになります。

B() { i = 45; }

コンパイルします。

継承された変数を初期化できないことを私は知りませんでした。私の質問は、なぜですか?

4

3 に答える 3

10

オブジェクトを初期化できるのは1回だけです。つまり、オブジェクトが最初に存在するときです。

Aコンストラクター内のすべてのメンバー変数を初期化します(コンストラクターの本体が実行される前)。したがって、のメンバー変数はのコンストラクターによって既に初期化されているため、のメンバーB変数を初期化できません。 AA

(この特定のケースでは、初期化されなかったiため、技術的には初期化されないままになります。それでも、メンバー変数を初期化するのはユーザーの責任です。)AA

于 2011-06-10T23:05:46.013 に答える
4

これはC++では実行できません。通常の方法はprotected、変数の設定に使用されるパラメーターを受け取る親クラスに()コンストラクターを含めることです。

このような保護された属性を使用することは、子クラスが親クラスの不変条件に違反することを可能にするため、ほとんど提案されません。これは、後で深刻なデバッグの問題を引き起こすだけです。

于 2011-06-10T23:08:58.533 に答える
2

クラスAのパラメーターを使用してパブリックコンストラクターを定義する必要があります。次に、クラスBで基本クラスのコンストラクターを使用します。例:

#include <iostream>
using namespace std;

class A {
protected:
    int i;
public:
    A(int number) : i(number) {}
};

class B : public A {
public:
    B() : A(45) { }
};

int main() {
    B b;
}
于 2011-06-10T23:07:33.117 に答える