0
class Human 
{
    protected:
        string name;
    public:
        Human () : name ("Jim") {}
        Human (string n) : name (n) {}
};

class Adult : public Human
{
    private:
        string passportId;
    public:
        Adult ()// : name ("Eric"), passportId ("N0123") - *THIS IS ERROR* 
        {
            // this is ok
            name = "Eric";  
            passportId = "N0934956";
        }

        Adult (string n, string id)// : name(n), passportId(id) *THIS IS ERROR*
        { 
            // this is ok
            name = n;
            passportId = id;
        }
};

したがって、基本クラスHumanと派生クラスAdultがあります。コード ( はコンストラクターの実装) では、コメント行を確認できます。

この状況でそのような初期化を使用するのはなぜ間違っているのでしょうか?

Adult (string n, string id) : name(n), passportId(id) {} // *THIS IS ERROR*
4

9 に答える 9

1

の member-initialization-list を実行する前Adultに、基本クラスの default-constructor が呼び出されて実行されます。基本クラスのサブオブジェクトの初期化中に、name(基本クラスのメンバーである) メンバーが構築 (および初期化) されます。つまり、派生クラスのメンバー初期化リストが実行されるまでに、name既に存在しているため、プログラムの形式が正しくありません。

あなたがしなければならないことは、適切に初期化するために適切な基本クラスのコンストラクターを選択するnameことです。方法は次のとおりです。

Adult (string n, string id) : Human(n), passportid(id) {}

それが役立つことを願っています。

于 2013-04-18T12:03:57.513 に答える
1

メンバー初期化子リスト (つまり:、コンストラクター内の後の初期化子) は、基本クラスとコンストラクターのクラスのメンバーのみを初期化できます。基本クラスのメンバーの初期化は、基本クラスのコンストラクターの仕事です。

于 2013-04-18T12:04:28.463 に答える
0

派生クラスにはオブジェクトとしてAdult含まれているため、作成するにはそのコンストラクターを呼び出す必要があります。オブジェクトが死ぬと、デストラクタが逆の順序で呼び出されますHumanAdult最初Adultに のデストラクタ、次にHumanのデストラクタ。

于 2013-04-18T12:04:29.063 に答える
-2

名前とnを間違えた?

Adult (string n, string id) : name(n), passportId(id) {}
于 2013-04-18T12:03:13.203 に答える