QMainWindow析构函数

时间:2012-10-19 15:11:12

标签: qt qmainwindow virtual-destructor

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

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

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