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对象的构造将包括七个“命中”。由于 Manager 继承自Employees,这是否意味着每个 Manager 对象都是“出生”为 Employee 并在以后成为 Manager 的?在它成为经理之后,您只需要添加两个字段而不是七个字段吗?

4

2 回答 2

5

是的,就是这样。

构造器参数自下而上流动,然后对象自上而下创建。如果您的派生类需要在其构造函数中访问基类成员,它必须是这样的。

于 2012-10-12T14:44:12.787 回答
4

在 .NET 中,在调用任何构造函数之前创建完整的对象。接下来,调用基础构造函数,然后调用派生类构造函数。

所以答案是否定的——经理对象不是作为雇员出生的,而是在以后成为经理的。相反,管理器对象是作为管理器对象诞生的……在构造函数被调用之前。

顺便说一句,在非托管 C++ 中,情况正好相反,尽管为派生类分配了足够的内存,但首先创建了 Employee 对象(调用 Employee 构造函数),并且调用的任何虚拟方法都将导致调度到基类方法体。然后构造 Manager 类。

于 2012-10-12T14:51:42.563 回答