析构函数可以在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