単純なインターフェース/実装設計を考えてみましょう。
class Base
{
public:
virtual ~Base()
{
// Virtual empty destructor
}
};
class Derived : public Base
{
public:
virtual ~Derived()
{
// Lots of clean up code here
// ...
}
};
この設計により、次のコードが安全で有効であることを理解しています。
Base* base = new Derived();
delete base; // Both Base::~Base and Derived::~Derived get called
ただし、新しいクラスがあったかどうかを想像してみてください。
class DerivedEx : public Derived
{
public:
// No destructor here, relying on default destructor generated by compiler
};
DerivedExは「安全」ですか?
安全のために、私は常にDerivedExに仮想の空のデストラクタを実装する必要があると想定していました。しかし、これは冗長で不必要なのか、そして私が気付いていない「落とし穴」があるのかどうか疑問に思っています。