【问题标题】:C++ Qt base class virtual destructorC++ Qt 基类虚析构函数
【发布时间】:2015-04-30 05:31:15
【问题描述】:

对于将在 Qt-way 中使用的类,我们是否需要一个虚拟析构函数: set QObject-parent 它将调用 QObject 的析构函数 deleteLater() 或类似的任何对象,它被设置为父母?

例如:

class MyWidget : public QWidget {
public:
    MyWidget() {
        w = new QWidget(this);
        // "w" will be deleted automatically by parent MyWidget::QWidget::QObject's destructor afaik
    }
private:
    QWidget *w;
}

如果要继承 MyWidget 类,我们是否需要一个虚拟析构函数?我认为没有理由这样做,因为它不会删除任何内容,并且从 QObject 派生的类的每个属性都将从 MyWidget::QWidget::QObject 的析构函数中删除。

【问题讨论】:

  • 我不明白这个问题:从QObject 派生的任何东西都已经有一个虚拟析构函数。您可以添加一个特定于类的,但这只是一个添加。如果这就是您的要求,则没有理由添加空析构函数。

标签: c++ qt inheritance destructor


【解决方案1】:

添加与否无关紧要,因为QWidget 继承的QObject 具有虚拟析构函数,并且会在整个层次结构中传播。

【讨论】:

    【解决方案2】:

    您不需要显式编写(空)virtual 析构函数,因为 QWidget 已经将其析构函数标记为 virtual,因此类层次结构的所有析构函数都自动为 virtual。

    但一般来说,如果你编写一个将要被继承的类(并且还没有带有virtual析构函数的基类),请始终指定virtual析构函数,否则事情会很糟糕如果有人试图通过基类类型的指针破坏你的类层次结构的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-16
      • 2012-06-26
      • 2019-04-20
      • 2014-10-02
      • 2018-06-29
      • 2011-02-03
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多