C++-为什么c++在调用子类的析构函数时会在调用基类的析构函数?
比如一个基类A定义了一个虚的析构函数,在子类B中也定义了一个虚的析构函数。
A *a= new B;
当嗲用析构函数时为什么会在调用了B的析构函数之后还要再调用一次A的虚构函数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
比如一个基类A定义了一个虚的析构函数,在子类B中也定义了一个虚的析构函数。
A *a= new B;
当嗲用析构函数时为什么会在调用了B的析构函数之后还要再调用一次A的虚构函数?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
C++规范里是这么定义的。
因为子类的对象里面,包括了一个基类对象的实例。
怎么释放基类自己的实例,只有基类自己的析构函数知道,所以当然要调用基类的析构函数了。
在OOP里面,继承下来的是接口,而不是实现,所以子类无法越俎代庖去做基类该做的事情。
析构应该和构造的顺序相反,构造是先调用基类构造函数,再调用子类构造函数,那么析构是调用子类构造函数,然后再调用基类构造函数~
这是C++的规定,这样做也是为了防止内存泄漏。当你在基类的构造函数中申请了资源的时候,派生类继承了基类,也就基础了基类的构造函数。所以析构的时候也要调用基类的析构函数。
构造和析构的顺序是相反的。
构造时,基类先构造,然后再派生类。析构时则反过来。先调用派生类的析构,再调用基类的析构。这符合资源栈的操作。先进后出,先申请的资源后释放。 举个例子:
class A {
public:
A() {
ch = new char[20];
}
virtual ~A() {
cout << "~A";
delete ch;
}
protected:
char* ch;
};
class B : public A {
public:
B() {
s = new string(ch);
}
virtual ~B() {
cout << "~B";
delete s;
}
protected:
string* s;
};
调用父类的析构函数,是为了能够把构造时分配给从父类继承过来的属性的空间释放掉。因为你构造子类时,子类从父类继承了一部分内容,这些内容所占的空间只有调用父类的析构函数才能释放掉。
析构函数就是要先析构子类再依次析构基类的啊……C++就是这么规定的