2

为什么 QMainWindow 的析构函数不是虚拟的?如果我从 QMainWindow 继承一个类 MainWindow 并在其上有一些指针属性,我无法使用 MainWindow 的析构函数删除内存。

4

3 回答 3

5

QMainWindow 的析构函数是对已经存在的析构函数 ( QWidget::~QWidget()) 的覆盖,而后者又是对虚拟析构函数 ( virtual QObject::~QObject()) 的覆盖。因此,QMainWindow::~QMainWindow()是虚拟的。与普通成员函数相同的规则适用。

于 2012-10-19T18:07:54.033 回答
4

QObject 的析构函数已被声明为虚拟的。QMainWindow 间接派生自 QObject。我相信 QMainWindow 的破坏在这种情况下不需要虚拟。您在删除派生类时是否在 QMainWindow 的析构函数中设置了断点?

于 2012-10-19T15:16:00.107 回答
0

这是 Qt 中的一个缺陷(未能遵守 CBP);最好的做法是在所有派生类中始终保留修饰符,尤其是虚拟修饰符,以避免此类问题。

不继承虚拟声明意味着,作为用户,我不仅要查找类,还要查找它的所有父类,以确保我要覆盖的方法是否是虚拟的。开发人员的一点懒惰花费了我很多时间。

关于“可维护性”的争论是无关紧要的;它使该类更难使用(用户将比维护者多得多……)

于 2013-02-13T22:46:57.973 回答