继承(五)—— 子类析构函数为什么不能主动调用父类的析构函数??

目录

1、提出问题

2、分析问题


在调用构造函数的时候,先调用父类的构造函数,然后再调用子类的构造函数。从内存的角度来看,其实是先在栈上添加父类的,然后再在栈上添加子类的。

因此,析构的时候,会先析构子类的,然后向下析构父类的。

1、提出问题

但是如果我们在显式添加子类的析构函数时,主动调用父类的析构函数。

// 父类
class Person
{
public:
	~Person() {
		cout << "~Person()" << endl;
	}
};

// 子类
class Student : public Person
{
public:

	~Student() {
		Person::~Person();		// 显式调用父类的析构
	}
};

int main() {
	Student s1;

	return 0;
}

我们发现父类的析构函数被调用了两次,如果父类的析构函数执行了 delete ptr[ ],那么这句话就会被执行两次,此时会造成程序运行崩溃。

2、分析问题

编译器为了保证,先析构子类,再析构父类,存在这么一条设定:在调用子类的析构函数以后,会自动调用父类的析构函数

如果此时我们在子类的析构函数中主动调用父类的析构函数,就会变成 调用完父类的析构函数以后,子类的析构函数才会执行完毕,然后编译器再自动调用一次父类的析构函数。这样一来,打乱了析构的顺序,析构函数也被调用了两次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值