派生类的构造函数
- 在上一篇博客中提到,基类的成员函数可以被继承,可以通过派生类的对象来访问,但这仅仅指的是普通的成员函数,而类的构造函数不能被继承
- 如何解决:
在派生类的构造函数中调用调用基类的构造函数,注意,不是直接在派生类构造函数体中直接调用基类的构造函数,这样只会创建一个临时对象,并不能达到初始化的目的。所以为了初始化基类成员,需要在派生类构造函数的初始化列表显示、调用基类的构造函数
看下面的代码
class Person{
private:
char * m_name;
public:
Person(char* name):m_name(name) { }
};
class Student :public Person {
private:
int m_age;
public:
Student(char* name,int age) :Person(name) ,m_age(age){}
void Display() {
cout << m_age << " " << m_name << endl;
}
};
int main() {
Student stu("少爷",18);
stu.Display();
return 0;
}
运行结果
18 少爷
-
继承中构造函数的调用原则
1、子类对象创建时会首先调用父类的构造函数
2、父类的构造函数在执行结束后,在执行子类的构造函数
3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
4、派生类不能调用间接基类的构造函数
派生类的析构函数
- 和构造函数类似,析构函数也不能被继承,与构造函数不同的是,在派生类的析构函数中不用显式的调用基类的构造函数,因为一个类只有一个析构函数,编译器知道该如何选择,无需程序员干涉。但是析构函数的执行顺序与构造函数相反
看下面的代码
class Person{
private:
char * m_name;
public:
char * m_name;
Person(){
cout << "Person()" << endl;
}
~Person(){
cout << "~Person()" << endl;
}
};
class Student :public Person {
private:
int m_age;
public:
Student(){
cout << "Student()" << endl;
}
~Student(){
cout << "~Student()" << endl;
}
};
int main() {
Student stu;
return 0;
}
运行结果
Person()
Student()
~Student()
~Person()