📜  C++中的纯虚拟析构函数

📅  最后修改于: 2021-05-26 03:24:17             🧑  作者: Mango

析构函数可以在C++中是纯虚拟的吗?
是的,有可能具有纯虚拟析构函数。纯虚拟析构函数在标准C++中是合法的,要记住的最重要的事情之一是,如果类包含纯虚拟析构函数,则它必须为纯虚拟析构函数提供函数体。您可能想知道为什么纯虚函数需要函数体。原因是因为析构函数(与其他函数不同)实际上并未被“重写”,而是始终以类派生的相反顺序对其进行调用。这意味着派生类的析构函数将首先被调用,然后基类的析构函数将被调用。如果未提供纯虚拟析构函数的定义,那么在销毁对象期间将调用什么函数体?因此,编译器和链接器强制存在用于纯虚拟析构函数体。
考虑以下程序:

#include 
class Base
{
public:
    virtual ~Base()=0; // Pure virtual destructor
};
  
class Derived : public Base
{
public:
    ~Derived()
    {
        std::cout << "~Derived() is executed";
    }
};
  
int main()
{
    Base *b=new Derived();
    delete b;
    return 0;
}

链接器将在上述程序中产生以下错误。

test.cpp:(.text$_ZN7DerivedD1Ev[__ZN7DerivedD1Ev]+0x4c): 
undefined reference to `Base::~Base()' 

现在,如果提供了纯虚拟析构函数的定义,则程序可以编译并正常运行。

#include 
class Base
{
public:
    virtual ~Base()=0; // Pure virtual destructor
};
Base::~Base()
{
    std::cout << "Pure virtual destructor is called";
}
  
class Derived : public Base
{
public:
    ~Derived()
    {
        std::cout << "~Derived() is executed\n";
    }
};
  
int main()
{
    Base *b = new Derived();
    delete b;
    return 0;
}

输出:

~Derived() is executed
Pure virtual destructor is called

重要的是要注意,当一个类包含纯虚拟析构函数时,该类将成为抽象类。例如,尝试编译以下程序。

#include 
class Test
{
public:
    virtual ~Test()=0; // Test now becomes abstract class
};
Test::~Test() { }
  
int main()
{
    Test p;
    Test* t1 = new Test;
    return 0;
}

上面的程序编译失败,并显示以下错误消息。
[错误]无法将变量’p’声明为抽象类型’Test’
[注意]因为以下虚拟函数在’Test’中是纯函数:
[注意]虚拟测试::〜Test()
[错误]无法分配抽象类型为“测试”的对象
[注意]由于类型’Test’具有纯虚函数

相关文章 :
C++中的构造方法
C++中的析构函数
虚拟析构函数

资料来源:
http://www.bogotobogo.com/cplusplus/virtualfunctions。的PHP
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”