5

Employee次のような基本クラスがあるとします

public Employee(string name, int id, float pay)
    : this(name, 0, id, pay, "") { }
public Employee(string name, int age, int id, float pay, string ssn)
{
    // Better!  Use properties when setting class data.
    // This reduces the amount of duplicate error checks.
    Name = name;
    Age = age;
    ID = id;
    Pay = pay;
    SocialSecurityNumber = ssn;
}

そして、次のようなコンストラクターManagerで継承するクラスEmployee

public Manager(string fullName, int age, int empID,
  float currPay, string ssn, int numbOfOpts)
    : base(fullName, age, empID, currPay, ssn)
{
    .
    StockOptions = numbOfOpts;
}

私の理解では、thisキーワードはbase同じクラスのコンストラクターにのみ適用されるキーワードと同じです。私の最大の質問は、参考書を読んでいるときに、チェーンを使用しない場合、Managerオブジェクトの構築には7つの「ヒット」が含まれると書かれていることです。Manager は Employees から継承するので、これはすべての Manager オブジェクトが Employee として「生まれ」、後で Manager になるということですか? そして、それがマネージャーになった後、7 つではなく 2 つのフィールドしか追加できませんか?

4

2 に答える 2

5

はい、それだけです。

コンストラクターのパラメーターは下から上に流れ、オブジェクトは上から下に作成されます。派生クラスがそのコンストラクターで基本クラスのメンバーにアクセスする必要がある場合は、このようにする必要があります。

于 2012-10-12T14:44:12.787 に答える
4

.NET では、コンストラクターが呼び出される前に完全なオブジェクトが作成されます。次に、基本コンストラクターが呼び出され、次に派生クラス コンストラクターが呼び出されます。

したがって、答えはノーです。マネージャー オブジェクトは従業員として生まれず、後でマネージャーになります。むしろ、マネージャー オブジェクトは、コンストラクターが呼び出される前に、マネージャー オブジェクトとして生まれます。

ところで、非マネージ C++ では逆です。派生クラスに十分なメモリが割り当てられますが、Employee オブジェクトが最初に作成され (Employee コンストラクターを呼び出します)、呼び出された仮想メソッドは基本クラスのメソッド本体にディスパッチされます。次に、Manager クラスが構築されます。

于 2012-10-12T14:51:42.563 に答える