本文转载自:VC驿站
https://www.cctry.com/thread-290040-1-1.html
1、子类的构造函数概述:
构造函数这个话题之前跟大家讲解过多次了,在之前课上的示例代码中也都有给大家写过构造函数,包括带参数的,不带参数等等。如果是单独的自己一个类,那么构造函数的知识点就是之前给大家讲解的,这里没必要重复了。可现在我们讲解到了类的继承和派生,那么子类的构造函数和父类的构造函数又是一个什么关系呢?定义一个子类的对象会不会自动调用父类的构造函数呢?接下来我们带着这些疑问来给大家讲解下!
2、构造函数是否可以被继承?
子类可以继承父类所有的成员变量和成员函数,但不能继承父类的构造函数。因此,在创建子类对象的时候,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造函数。
3、父类构造函数的调用规则:
①. 如果子类没有定义构造函数,则调用父类的无参数的构造函数;
②. 如果子类定义了构造函数,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造函数,然后执行自己的构造函数;
③. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数;
④. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数;
⑤. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造函数,则子类必须显示调用此带参构造函数);
以上总结起来就两句话:
如果子类没有显示的调用父类的构造函数,那么默认会调用父类无参的构造函数!!!
如果父类只提供了有参数的构造函数,那么子类在默认情况下调用父类的无参构造函数时就会报错!
⑥. 如果子类调用父类带参数的构造函数,需要用初始化父类成员对象的方式,例如:
class CXiaoStudent : public CStudent
{
public:
int yuwen_score;
int shuxue_score;
int english_score;
CXiaoStudent() : CStudent("zhangsan", 'm', 1001, 20)
{
yuwen_score = 2;
shuxue_score = 0;
english_score = 0;
flag_private = 0;
flag_protected = 0;
}
private:
int flag_private;
protected:
int flag_protected;
};
具体每一条的详细规则见视频教程讲解!
4、子类的析构函数是否可以被继承?
跟父类的构造函数一样,子类也一样不能继承父类的析构函数,也需要通过派生子类的析构函数去调用父类的析构函数。在执行子类的析构函数时,系统会自动调用父类的析构函数和子对象的析构函数,对父类和子对象进行清理工作。
调用的顺序跟构造函数正好相反:先执行子类自己的析构函数,对派生类新增加的成员进行清理,之后调用子对象的析构函数,对子对象进行清理,最后调用父类的的析构函数,对基类进行清理。
5、多重继承:
关于多重继承方面的知识点,在实际编程过程中用的不多,这里不做课上讲解,大家感兴趣的话课后自己学习一下吧,也算是一个小作业了!
6、小作业:
用一个函数来实现一个功能,分别统计全市在校学生的平均年龄。学生包括小学生、中学生、高中生、大学生 等。用一个函数来实现!
下节课会给大家解答这个小作业,用的方法也是下节课即将要讲解的,大家先事先自己试试吧!
第40课视频教程下载地址: