このことを考慮:
class FluffyThing
{
public:
FluffyThing()
{
m_pMyFur = new Fur;
}
virtual ~FluffyThing();
protected:
Fur * m_pMyFur;
};
class ClawedFluffyThing : public FluffyThing
{
public:
ClawedFluffyThing()
: FluffyThing()
{
m_pMyClaws = new Claws;
}
virtual ~ClawedFluffyThing();
protected:
Claws * m_pMyClaws;
};
class ScaryFluffyThing : public ClawedFluffyThing
{
public:
ScaryFluffyThing()
: ClawedFluffyThing()
{
m_pMyTeeth = new Teeth;
m_pMyCollar = new SpikedCollar;
}
virtual ~ScaryFluffyThing();
protected:
Teeth * m_pMyTeeth;
SpikedCollar * m_pMyCollar;
};
あまり間違いがないことを願っています。重要なポイントは、それらの間に IS-A 関係を持つ 3 つのクラスがあり、各クラスには、破棄時に何らかのクリーンアップが必要になる属性も 1 つまたは 2 つあるということです。仮想デストラクタを宣言していなかった場合、コンパイラは次のものを自動的に生成しますか? デストラクタを宣言したため、(クラスが使用されていると仮定して) それらを実装することを余儀なくされたのは、破壊を行うための正しい長時間の方法に続くものですか?
FluffyThing::~FluffyThing()
{
delete m_pMyFur;
}
ClawedFluffyThing::~ClawedFluffyThing()
{
delete m_pMyClaws;
FluffyThing::~FluffyThing();
}
ScaryFluffyThing::~ScaryFluffyThing()
{
delete m_pMyTeeth;
delete m_pMyCollar;
ClawedFluffyThing::~ClawedFluffyThing();
}
決定的な答えはすでにそこにあるはずです...しかし、私は自分の好みに合わせてすぐにそれを手に入れることができませんでした.