如果没有显示的为类定义任何构造函数,编译器就会为类定义默认的构造函数,反过来,如果为类定义的任何构造函数,编译器都不会再定义默认的构造函数。
如果在一个层次的类中,没有为类定义任何构造函数,那么在实例化一个类时,编译器解决这些层次结构的构造问题顺序是这样的:
首先 编译器找到要实例化的类的构造函数,这个构造函数再找到其直接基类的构造函数,这个直接基类的构造函数再找到他的直接基类的构造函数。。。。。。。一直找到Object类为止,因为Object没有基类了,这样就执行Object的构造函数,执行完后返回,再执行其直接子类的构造函数,执行完再返回。。。。。。这样就像现今政府机构下达命令一样,一层层下发,直到实例化那个类为止。因为从头到尾调用的都是编译器生成的构造函数(称为默认构造函数),所以整个过程都是编译器在忙。
如果我在这个层次的类中手动为一个类添加了一个无参数的构造的话,(因为编译器不会去生成默认的构造函数了) ,编译器做的工作和上面一样,层层上报,再层层下发,只不过用我的构造函数替换了编译器的默认构造函数而已。
如果我在这个层次的类中手动为一个类添加了一个带参数的构造函数的话,(编译器同样不会去生成默认的构造函数,好像只要你侵犯他的构造领域,他就不去管了),这样编译时当然会报错。 因为其下层构造函数要在这里找一个无参数的构造函数发现找不到了。怎么办?
指定派生类在基类中查找的构造函数
class
a
{
public string name;
// public a()
// {
// name = "调用了无参数的构造";
// Console.WriteLine(name);
// }
public a( int i)
{
name = " 调用了有参数的构造 " + " /t " + i;
Console.WriteLine(name);
}
}
class b : a
{
public decimal salary;
public b():base(3)
{
salary = 5000;
}
}
{
public string name;
// public a()
// {
// name = "调用了无参数的构造";
// Console.WriteLine(name);
// }
public a( int i)
{
name = " 调用了有参数的构造 " + " /t " + i;
Console.WriteLine(name);
}
}
class b : a
{
public decimal salary;
public b():base(3)
{
salary = 5000;
}
}