构造方法是类的一个特殊成员,它会在实例化对象时被自动调用。咱们没法使用对象来调用构造函数,由于在构造函数构造出对象以前,对象是不存在的。所以构造函数被用来建立对象,而不能经过对象来调用。c++
那么咱们都知道继承,继承因为派生类继承基类内成员(没法继承构造方法,继承了私有成员,只是没法直接访问),我派生类能够调用基类的成员,那么我派生类确定要知道基类是如何对本身数据进行初始化的。那么这提出了第一个要求。函数
以C++代码为例,假设咱们如今有两个类,基类Person,派生类Student设计
class Person { public: // constructor with argument Person(int x) { cout << "Person Constructor with " << x << endl; } }; class Student:public Person { public: // default constructor without argument Student() { cout << "Student Default Constructor" << endl; } }; int main (){ Student a; }
咱们看上面的代码,基类没有无参构造方法,派生类有。咱们知道主函数中 Student a 这行代码会隐性调用Student类中默认的无参构造方法。同时,刚刚学到的,也确定会调用基类Person中的构造方法。可是,这里的代码没有指定会调用基类哪个构造方法,因此就会调用基类Person默认的无参构造方法。code
但是,基类Person没有无参构造方法啊!!!因此这个程序编译器的确会报错,这也就提出了下一个要求。对象
因而,咱们修改代码,继承
class Person { public: // default constructor Person() { cout << "Person Default Constructor" << endl; } // constructor with argument Person(int x) { cout << "Person Constructor with " << x << endl; } }; class Student:public Person { public: // default constructor Student() { cout << "Student Default Constructor" << endl; } // constructor with argument Student(int y) { cout << "Student Constructor with " << y << endl; } }; int main(){ Student a; return 0; } /* Output Person Default Constructor Student Default Constructor */
这样,程序就正常运行了。因为咱们是调用了派生类的默认无参构造方法,一样也调用了基类的无参构造方法。编译器
咱们能够看到,是先调用了基类的构造方法再调用了派生类的构造方法,符合人们的认知。或者你能够这么想,我是我父母的孩子,我身上的DNA来自于他们,我不得先知道他们的DNA是啥才行吗?因此建立派生类对象时会先调用基类的构造方法。it
那么问题来了,个人派生类的构造方法,想显式地调用基类别的构造方法,能够吗?编译
固然是能够的。class
class Person { public: Person() { cout << "Person Default Constructor" << endl; } Person(int x) { cout << "Person Constructor with " << x << endl; } }; class Student:public Person { public: // 调用父类中带参的构造方法 Student() : Person(10) { cout << "Student Default Constructor" << endl; } // 一样调用父类中带参的构造方法 Student(int y) : Person(y) { cout << "Student Constructor with " << y << endl; } }; int main(){ Student a(20); return 0; } /* Output Person Constructor with 20 Student Constructor with 20 */