C++的继承和派生(二)派生类的构造函数和析构函数

派生类的构造函数

  • 在上一篇博客中提到,基类的成员函数可以被继承,可以通过派生类的对象来访问,但这仅仅指的是普通的成员函数,而类的构造函数不能被继承
  • 如何解决:
    在派生类的构造函数中调用调用基类的构造函数,注意,不是直接在派生类构造函数体中直接调用基类的构造函数,这样只会创建一个临时对象,并不能达到初始化的目的。所以为了初始化基类成员,需要在派生类构造函数的初始化列表显示、调用基类的构造函数

看下面的代码

class Person{
privatechar * 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()

猜你喜欢

转载自blog.csdn.net/qq_47329614/article/details/106953285