假设有一个名为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?在它是经理之后,你只有两个要添加的字段而不是七个?
答案 0 :(得分:5)
是的,就是这样。
构造函数参数从下向上流动,然后从上到下创建对象。如果派生类需要在其构造函数中访问基类成员,则必须如此。
答案 1 :(得分:4)
在.NET中,在调用任何构造函数之前创建完整对象。接下来,调用基础构造函数,然后调用派生类构造函数。
所以答案是否定的 - 管理者对象不是作为员工而生,后来成为管理者。相反,管理器对象在构造函数被调用之前作为管理器对象诞生。
BTW,在非托管C ++中,情况正好相反,虽然为派生类分配了足够的内存,但首先创建了Employee对象(调用Employee构造函数),所有调用的虚拟方法都将导致派遣到基类方法体。然后构建Manager类。