析构函数的虚析构和非虚析构调用的差别

Posted 德克斯特的实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了析构函数的虚析构和非虚析构调用的差别相关的知识,希望对你有一定的参考价值。

 

 

代码示例:

非虚析构的情况下.

#include <stdio.h>
#include <iostream>

using namespace std;

class A
{
public:
        A()
        {
                std::cout << "A is created." << std::endl;
        }
 
        ~A()
        {
                std::cout << "A is deleted." << std::endl;
        }
};
 
class B : public A
{
public:
        B()
        {
                std::cout << "B is created." << std::endl;
        }
 
        ~B()
        {
                std::cout << "B is deleted." << std::endl;
        }
};

 
int main()
{
    A* pA = new B();
    delete pA;
    return 0;
}

虚析构的情况下.

#include <stdio.h>
#include <iostream>

using namespace std;

class A
{
public:
        A()
        {
                std::cout << "A is created." << std::endl;
        }
 
        virtual ~A()
        {
                std::cout << "A is deleted." << std::endl;
        }
};
 
class B : public A
{
public:
        B()
        {
                std::cout << "B is created." << std::endl;
        }
 
        ~B()
        {
                std::cout << "B is deleted." << std::endl;
        }
};

 
int main()
{
    A* pA = new B();
    delete pA;
    return 0;
}

 

如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。

以上是关于析构函数的虚析构和非虚析构调用的差别的主要内容,如果未能解决你的问题,请参考以下文章

C++ --- 虚析构和纯虚析构

多态中的虚析构函数

C++的虚函数表和虚析构

为啥纯虚析构函数需要实现

c++ 多态学习

虚析构函数与纯虚函数