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

本文详细解析了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()

  • 再补充个知识点:
    当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。当对象使用完后(离开作用域,所占内存自动释放),然后会自动调用析构函数。编译器管理了对象的整个生命周期。如果编译器无法调用类的析构函数,情况会是怎样的呢?比如,类的析构函数是私有的,编译器无法调用析构函数来释放内存。
    编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。因此,将析构函数设为私有,类对象就无法建立在栈上了。这样就只能使用new操作符来建立对象,构造函数是公有的,可以直接调用。类中必须提供一个destory函数,来进行内存空间的释放。类对象使用完成后,必须调用destory函数。

请看下面的代码

class Human{
public :
	void test(){
		printf("human...\n");
	}
	void destroy(){
		delete this;
	}

private:
	~Human(){
		printf("delete successful!...\n");
	}
};

int main(){
	Human* hp=new Human();
	hp->test();
	hp->destroy();
	return 0;
}

运行结果

human...
delete successful!...

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值