构造函数总是与众不同,牵涉到多态性的时候也不例外。尽管构造函数不是多态的(实际上它们都是static方法,只是声明的时候没有直说),但是能理解它在复杂的类系和多态的环境下是如何工作的,仍然十分重要,在创建派生类对象的过程中,基类的构造函数总是先得到调用,这样一级一级的追溯上去,每个基类的构造函数都会被调用。这种做法是很合乎情理的,因为构造函数有一个特殊的任务:它要知道对象是不是被正确地创建了。
派生类只能访问它自己的成员,它看不到基类的成员(因为它们通常是private的)。只有基类的构造函数才知道怎样初始化它的成员,同时也只有它才有权限进行初始化。因此“把所有的构造函数都调用一遍”就变得非常重要了,否则对象就没法创建了。这就是为什么编译器会强制每个派生类都要调用其基类的构造函数的原因了。如果你不在派生类的构造函数里明确地调用基类的构造函数,那编译器就会悄悄的调用那个默认的构造函数。如果没有默认构造函数,编译器就会报错。要是类没有构造函数,编译器会自动为你准备一个默认构造函数。