【发布时间】:2017-08-18 15:45:03
【问题描述】:
在实现奇怪的循环模板模式 (CRTP) 时,析构函数是否必须是虚拟的?如果不是,那么正确的非虚拟实现是什么?
我将提供一个示例,希望能让事情变得更简单:
template<typename T>
class Base
{
public:
virtual ~Base()
{
// Should this be virtual? Non-virtual?
std::cout << "Base::~Base()\n";
}
};
class Derived : public Base<Derived>
{
public:
~Derived() override
{
std::cout << "Derived::~Derived()\n";
}
};
int main()
{
Base<Derived>* b = new Derived;
delete b;
}
结果:
Derived::~Derived()
Base::~Base()
编辑:更新了示例以使用运行时多态性,以便正确清理需要虚拟析构函数。
【问题讨论】: