一、结论
基类的构造函数、析构函数不能被派生类继承。
1. 在派生类中,如果对派生类新增的成员进行初始化,就必须针对实际需要加入新的构造函数。
2. 派生类新的构造函数只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,需要调用基类构造函数完成。
3. 初始化子类时,先自动调用父类的构造函数,然后才调用子类的构造函数。
4. 同样,对派生类对象的扫尾、清理工作也需要加入新的析构函数。不需要显式地调用基类的析构函数,系统会自动隐式调用。析构函数按构造函数的相反顺序执行。
二、子类的构造函数中调用基类的构造函数
#include<iostream>
using namespace std;
//基类People
class People{
protected:
char *m_name;
int m_age;
public:
People(char*, int);
};
People::People(char *name, int age): m_name(name), m_age(age){}
//派生类Student
class Student: public People{
private:
float m_score;
public:
Student(char *name, int age, float score);
void display();
};
//People(name, age)就是调用基类的构造函数
Student::Student(char *name, int age, float score): People(name, age), m_score(score){ }
void Student::display(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"。"<<endl;
}
int main(){
Student stu("小明", 16, 90.5);
stu.display();
return 0;
}
Student::Student(char *name, int age, float score): People(name, age), m_score(score){ }
People(name, age)就是调用基类的构造函数,并将 name 和 age 作为实参传递给它,m_score(score)是子类的参数初始化表,它们之间以逗号,隔开。