由于派生类包含基类的原因,我们在创建一个派生类的时候,系统会先创建一个基类。需要注意的是,派生类会吸纳基类的全部成员,但并不包括构造函数及后面讲的析构函数,那么就意味着创建派生类在调用自己的构造函数之前,会先调用基类的构造函数。
这里一点我们可以通过代码验证:
#include<iostream> using namespace std; class Clock { private: int H; int M; int S; public: Clock() { cout<<"Clock's Constructor Called!"<<endl; } }; class AlarmClock:public Clock { private: int AH; int AM; public: AlarmClock() { cout<<"AlarmClock's Constructor Called!"<<endl; } }; int main() { AlarmClock A; return 0; }
运行截图如下:
我们可以看到仅仅定义了一个派生类对象,派生类和基类的构造函数会自动调用,调用顺序是先调用基类的构造函数再调用派生类的构造函数。
以上大家看到的是最常见也最简单的调用方法,这仅仅是隐式的,也就是不用写出来的、自动的调用。那么当基类的构造函数是带参数的情况下如何调用呢?这样还可以吗?如何传参呢?
答:那就需要我们显式的,也就是明确的写出来,并指定参数传递,来告诉编译器。
一般的写法格式为:
派生类构造函数名(总形参表列):基类构造函数(实参表列)
例如代码:
#include<iostream> using namespace std; class Clock { private: int H; int M; int S; public: Clock() { cout<<"Clock's Constructor Called!"<<endl; } Clock(int h,int m,int s) { this->H = h; this->M = m; this->S = s; cout<<"Clock's Constructor with parameter Called!"<<endl; } }; class AlarmClock:public Clock { private: int AH; int AM; public: AlarmClock() { cout<<"AlarmClock's Constructor Called!"<<endl; } AlarmClock(int h,int m,int s):Clock(h,m,s) { cout<<"AlarmClock's Constructor with parameter Called!"<<endl; } }; int main() { AlarmClock A(8,10,30); AlarmClock B; return 0; }
大家注意看派生类的构造函数,后面通过冒号跟基类的传参,且基类里的参数里为实参,来实现显示的参数调用。请大家上机实践!
需要注意的是,一旦基类中有带参数的构造函数,派生类中则必须有显式传参的派生类构造函数,来实现基类中参数的传递,完成初始化工作。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程