类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成。所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都被初始化。
解决这个问题的思路是:在执行派生类的构造函数时,调用基类的构造函数。
下面的例子展示了如何在派生类的构造函数中调用基类的构造函数。
运行结果为:
小明的年龄是16,成绩是90.5
请注意代码第23行:
实际上,你可以将对基类构造函数的调用和参数初始化表放在一起,如下所示:
需要注意的是:冒号后面是对基类构造函数的调用,而不是声明,所以括号里的参数是实参,它们不但可以是派生类构造函数总参数表中的参数,还可以是局部变量、常量等。如下所示:
解决这个问题的思路是:在执行派生类的构造函数时,调用基类的构造函数。
下面的例子展示了如何在派生类的构造函数中调用基类的构造函数。
- #include<iostream>
- using namespace std;
- //基类
- class People{
- protected:
- char *name;
- int age;
- public:
- People(char*, int);
- };
- People::People(char *name, int age): name(name), age(age){}
- //派生类
- class Student: public People{
- private:
- float score;
- public:
- Student(char*, int, float);
- void display();
- };
- //调用了基类的构造函数
- Student::Student(char *name, int age, float score): People(name, age){
- this->score = score;
- }
- void Student::display(){
- cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
- }
- int main(){
- Student stu("小明", 16, 90.5);
- stu.display();
- return 0;
- }
小明的年龄是16,成绩是90.5
请注意代码第23行:
Student::Student(char *name, int age, float score): People(name, age)这是派生类 Student 的构造函数的写法。冒号前面是派生类构造函数的头部,这和我们以前介绍的构造函数的形式一样,但它的形参列表包括了初始化基类和派生类的成员变量所需的数据;冒号后面是对基类构造函数的调用,这和普通构造函数的参数初始化表非常类似。
实际上,你可以将对基类构造函数的调用和参数初始化表放在一起,如下所示:
Student::Student(char *name, int age, float score): People(name, age), score(score){}基类构造函数和初始化表用逗号隔开。
需要注意的是:冒号后面是对基类构造函数的调用,而不是声明,所以括号里的参数是实参,它们不但可以是派生类构造函数总参数表中的参数,还可以是局部变量、常量等。如下所示:
Student::Student(char *name, int age, float score): People("李磊", 20)