CRTP(Curtainly Recurring Template Pattern)を実装するときに、デストラクタを仮想化する必要がありますか?そうでない場合は、適切な非仮想実装は何ですか?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()
EDIT:ように、ランタイムポリモーフィズムを使用する例を更新しました適切なクリーンアップには仮想デストラクタが必要です。