C++ Qt基类虚析构函数

6
我们需要为那些将以Qt方式使用的类编写虚析构函数吗?即设置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派生的东西已经有了虚析构函数。你可以添加一个特定于类的析构函数,但那只是额外的。如果你的问题是要求添加空析构函数,那是没有必要的。 - Kuba hasn't forgotten Monica
2个回答

5
无论是否添加,都没有关系,因为QWidget继承自QObject,而QObject带有虚析构函数,这个特性会沿着整个层次结构传递。

4
你不需要显式编写一个(空的)虚析构函数,因为QWidget已经将其析构函数标记为virtual,因此自动使得类层次结构中的所有析构函数都成为virtual。
但是通常情况下,如果你编写一个将被继承的类(并且没有带有virtual析构函数的基类),请始终指定virtual析构函数,否则如果任何人尝试通过基类类型的指针销毁你的类层次结构中的对象,则会导致严重问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接