1

假设我们有三个类:Parent、Child 和 Other。

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;
};

可以为所有这些类使用默认析构函数吗?

我的意思是,因为我没有手动分配任何内存,所以我不需要关心它的释放。

大问题:当默认析构函数足够时,是否有一般规则?

4

3 回答 3

4

您需要为 定义一个虚拟析构函数Parent,但析构函数的主体将在 C++11 中默认为空或为空。它仍然是默认析构函数,但您需要显式定义它,以便可以delete Child通过指向Parent.

class Parent {
public:
    virtual ~Parent() = default;
    // virtual ~Parent() {} //
    // ...
};

在不考虑多态性的情况下,您只需要在类需要在销毁时做一些额外的事情时定义一个析构函数。例如,该类可能需要取消分配手动管理的资源或从某处注销。另一个特殊情况是作用域守卫,其唯一目的是在销毁时做某事。

我制作的几乎所有类都只有默认析构函数。当我看到一个明确的析构函数定义时,我开始怀疑。

于 2013-09-05T20:00:33.263 回答
4

如果你有一个指向 Parent 的指针,它指向一个 Child 对象,而 Parent 没有虚拟析构函数,则不会调用 Child 的析构函数。因此 Parent 需要一个虚拟析构函数,即使它是空的。(除非您保证这种情况永远不会发生)。

Child 在您的代码示例中不需要析构函数。将自动生成一个合适的,它是虚拟的,因为父析构函数在固定代码中是虚拟的。

于 2013-09-05T20:07:46.180 回答
2

大问题:当默认析构函数足够时,是否有一般规则?

如果你必须为这些类编写析构函数,它会做什么?

~Parent() { }

~Child() { }

~Other() { }

如果它们看起来像那样,那么就没有必要写了。

于 2013-09-05T20:04:07.687 回答