假设我们有三个班级:父母,孩子和其他。
class Parent: {
public:
Parent(std::string title): m_title(title) { }
void setTitle (std::string title);
private:
std::string m_title;
};
class Child: public Parent {
public:
Child(std::string title) { setTitle(title); }
private:
Other object;
};
class Other {
public:
Other() : m_body("") { }
std::string body();
void setBody(std::string);
private:
std::string m_body;
};
对所有这些类使用默认析构函数是否可以?
我的观点是,由于我没有手动分配任何内存,所以我不需要关心它的释放。
大问题:当默认析构函数足够时,是否有一般规则?
答案 0 :(得分:4)
您需要为Parent
定义虚拟析构函数,但析构函数的主体将在C ++ 11中默认或为空。它仍然是默认的析构函数,但您需要明确定义它,以便delete
Child
通过指向Parent
的指针。
class Parent {
public:
virtual ~Parent() = default;
// virtual ~Parent() {} //
// ...
};
在不考虑多态性的情况下,只需要在类需要在销毁时执行额外操作时才需要定义析构函数。例如,类可能需要释放手动管理的资源或从某处取消注册。另一个特殊情况是守卫,其唯一目的是在破坏方面做点什么。
我制作的几乎所有类都只有默认的析构函数。当我看到一个明确的析构函数定义时,我开始怀疑。
答案 1 :(得分:4)
如果您有一个指向Parent对象的指针,而Parent指向一个Child对象,而Parent没有虚析构函数,则不会调用Child的析构函数。因此,Parent需要一个虚拟析构函数,即使它是一个空的析构函数。 (除非你保证这种情况永远不会发生)。
Child在代码示例中不需要析构函数。将自动生成一个适当的,并且它将是虚拟的,因为父析构函数在固定代码中是虚拟的。
答案 2 :(得分:2)
大问题:当默认析构函数足够时,是否有一般规则?
如果你必须为这些类编写析构函数,它会做什么?
~Parent() { }
~Child() { }
~Other() { }
如果它们看起来像那样,那么就没有必要写它了。