谁让狗出去的?- 当"Is-A"在类层次结构中遇到"Has-A"时销毁对象
Who let the dogs out? - Object destruction when "Is-A" meets "Has-A" in a class hierarchy
考虑一下:
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;
};
希望没有太多错误 - 我想你明白了。关键的一点是,有 3 个类之间具有 IS-A 关系,每个类还有一两个 HAS-A 属性,在销毁时间方面需要一些清理。如果我没有声明虚拟析构函数,编译器会为我自动生成以下内容吗?声明析构函数并因此被迫实现它们(假设使用了类)是执行销毁的正确方法吗?
FluffyThing::~FluffyThing()
{
delete m_pMyFur;
}
ClawedFluffyThing::~ClawedFluffyThing()
{
delete m_pMyClaws;
FluffyThing::~FluffyThing();
}
ScaryFluffyThing::~ScaryFluffyThing()
{
delete m_pMyTeeth;
delete m_pMyCollar;
ClawedFluffyThing::~ClawedFluffyThing();
}
肯定已经有一个明确的答案了......但我不能足够快地把手放在我喜欢的地方。
No.您不会手动调用基类的析构函数,它们会自动调用,顺序与继承相反。除此之外,还好。
FluffyThing::~FluffyThing()
{
delete m_pMyFur;
}
ClawedFluffyThing::~ClawedFluffyThing()
{
delete m_pMyClaws;
} //will call ~FluffyThing
ScaryFluffyThing::~ScaryFluffyThing()
{
delete m_pMyTeeth;
delete m_pMyCollar;
} //will call ~ClawedFluffyThing
当然,如果您使用 RAII(智能指针而不是原始指针),您甚至不需要 delete
s。
如果我没有声明虚拟析构函数,编译器会为我自动生成以下内容吗?
第:)号 virtual
析构函数用于在通过基类指针删除派生类实例时的正确行为。以下:
FluffyThing* p = new ScaryFluffyThing;
delete p;
只有当FluffyThing
的析构函数是虚拟的时才合法。否则,这是未定义的行为。
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 类层次结构中的运算符重载
- 如何在层次结构中实现运算符使用?
- 反向层次结构中的可变参数模板参数
- 如何在继承层次结构中调用具有默认参数的构造函数?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在C++继承层次结构时提取实现者
- 在C++中将类实例添加到对象层次结构中的问题
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在继承层次结构中复制和移动
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 删除父/子窗口层次结构的最佳方法
- 是否可以使一个类成为两个不同层次结构的子类?
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 谁让狗出去的?- 当"Is-A"在类层次结构中遇到"Has-A"时销毁对象