类可以通过派生的方式产生一堆子类。因为子类继承于父类,因此,子类的对象在示例化的时候系统会优先创建一个父类。例如:
class Animal{
public:
Animal{
cout << "Animal" << endl;
}
};
class Dog: public Animal{
};
int main(){
Dog dog;
return 0;
}
在上面的例子中,Dog为子类,所以Dog在示例化的时候系统会首先创建一个Animal的类。因此,此段代码在执行的时候,会在控制台输出一个Animal的单词,这就是因为Animal在首先创建的时候调用了其构造函数。
类的继承虽然可以将属性和行为继承到子类中,但是不会继承构造函数。
也就是说,父类的构造函数是父类的构造函数,派生的子类中不存在拷贝出来的父类的构造函数。因此,子类的构造函数需要使用者单独写入。但是由于在创建子类的时候会优先创建一个父类的关系,父类的构造函数总会优先于子类的构造函数调用。如下:
#include <iostream>
using namespace std;
class Animal {
public:
Animal() {
cout << "animal!" << endl;
}
};
class Dog :public Animal {
public:
Dog() {
cout << "dog!" << endl;
}
};
int main() {
Dog dog;
return 0;
}
此时,在运行程序后,会优先创建Dog的父类Animal类,当Animal类创建完成以后就会自动调用Animal的构造函数,然后再创建一个Dog类,再调用Dog的构造函数。
此外,构造函数可以重载,当父类存在多个构造函数的时候,可以指定子类的构造函数在使用时直接调用父类的其中一个构造函数。
#include <iostream>
using namespace std;
class Animal {
protected:
int age;
public:
Animal() {
cout << "animal!" << endl;
}
Animal(int age) {
this->age = age;
}
};
class Dog :public Animal {
public:
Dog() {
cout << "dog!" << endl;
}
Dog(int age) :Animal() {
this->age = age;
cout << "dogs!" << endl;
}
void show() {
cout << "age: " << age << endl;
}
};
int main() {
Dog dog(12);
dog.show();
return 0;
}
在上面的代码中,父类存在两个构造函数,子类也存在两个构造函数。在使用子类的构造函数的时候系统一定会创建一个父类的对象,在创建父类的对象的时候一定会调用父类的构造函数,但是此时父类中存在多个构造函数,若是不指定,则会直接调用无参构造,若是指定,则会调用指定的构造函数。
此时,首先调用了Dog类的有参构造,而Dog类的有参构造后面跟上的是Animal类的无参构造,所以在系统创建dog对象时会优先调用父类的无参构造函数,然后再调用子类的有参构造。