C++-为什么c++在调用子类的析构函数时会在调用基类的析构函数?

发布于 2016-12-07 01:41:58 字数 106 浏览 1938 评论 6

比如一个基类A定义了一个虚的析构函数,在子类B中也定义了一个虚的析构函数。
A *a= new B;
当嗲用析构函数时为什么会在调用了B的析构函数之后还要再调用一次A的虚构函数?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

归属感 2017-10-25 23:50:02

C++规范里是这么定义的。

泛泛之交 2017-09-13 03:50:31

因为子类的对象里面,包括了一个基类对象的实例。
怎么释放基类自己的实例,只有基类自己的析构函数知道,所以当然要调用基类的析构函数了。

在OOP里面,继承下来的是接口,而不是实现,所以子类无法越俎代庖去做基类该做的事情。

夜无邪 2017-08-20 07:12:29

析构应该和构造的顺序相反,构造是先调用基类构造函数,再调用子类构造函数,那么析构是调用子类构造函数,然后再调用基类构造函数~

夜无邪 2017-05-15 16:23:36

这是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;
};

偏爱自由 2017-03-18 23:48:04

调用父类的析构函数,是为了能够把构造时分配给从父类继承过来的属性的空间释放掉。因为你构造子类时,子类从父类继承了一部分内容,这些内容所占的空间只有调用父类的析构函数才能释放掉。

晚风撩人 2017-01-14 14:15:47

析构函数就是要先析构子类再依次析构基类的啊……C++就是这么规定的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文