派生类的析构函数

 2023-05-19 15:40:05  阅读 0

在继承的时候除了构造函数无法被继承外,析构函数也是无法被继承的。

 

但是,和构造函数不同,析构析构实在函数的结束的时候调用的。构造是谁先创建谁就先调用,但是析构是谁先释放谁就先调用。

 

如下:

 

#include <iostream>
using namespace std;
​
class Animal {
public:
    ~Animal() {
        cout << "~Animal" << endl;
    }
};
​
class Dog :public Animal {
public:
    ~Dog() {
        cout << "~Dog" << endl;
    }
};
​
int main() {
    Dog dog;
    return 0;
}

 

 

如上,通过上面的方法为子类Dog实例化,在进行创建的时候,会优先创建一个父类,再创建一个子类,但是释放的时候就不同。释放的时候是先释放子类再释放父类。就是说dog对象在main函数调用结束后,会先调用Dog类本身的析构函数,然后再调用父类的析构函数。

 

除此之外,再看一种情况,如下:

 

#include <iostream>
using namespace std;
​
class Animal {
public:
    ~Animal() {
        cout << "~Animal" << endl;
    }
};
​
class Dog :public Animal {
public:
    ~Dog() {
        cout << "~Dog" << endl;
    }
};
​
class Cat :public Animal {
public:
    ~Cat() {
        cout << "~Cat" << endl;
    }
};
​
int main() {
    Dog dog;
    Cat cat;
    return 0;
}

 

 

在上述代码中,除了Dog类继承了Animal外,Cat类也继承了Animal类。但是最后运行代码时会发现,系统优先调用了cat的析构函数。

 

在C/C++学习阶段,有着内存四区的说法。其中,函数中的临时变量存储在栈区,栈区具有先进后出,后进先出的特点。在main中,cat是在dog后面创建的。因此,会优先释放cat对象,所以,会优先调用cat类的析构函数。

下一篇: 虚基类
标签:

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码