继承引出的对构造方法的要求

继承引出的对构造方法的要求

构造方法是类的一个特殊成员,它会在实例化对象时被自动调用。咱们没法使用对象来调用构造函数,由于在构造函数构造出对象以前,对象是不存在的。所以构造函数被用来建立对象,而不能经过对象来调用。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没有无参构造方法啊!!!因此这个程序编译器的确会报错,这也就提出了下一个要求。对象

  • 必定要设计至少2个构造方法,包含1个有参数的构造方法用于初始化成员变量和1个无参数的构造方法设定默认状况。

因而,咱们修改代码,继承

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

*/
  • 派生类能够指定调用指定的基类构造方法。若是基类的构造方法是无参的,那么在派生类中写不写均可以,不写的话会隐式地调用。
相关文章
相关标签/搜索