2

QMainWindow のデストラクタが仮想でないのはなぜですか? QMainWindow からクラス MainWindow を継承し、それにポインタ属性がある場合、MainWindow のデストラクタを使用してメモリを削除できません。

4

3 に答える 3

5

QMainWindowのデストラクタは、既存のデストラクタ(QWidget::~QWidget())のオーバーライドであり、仮想デストラクタ(virtual QObject::~QObject())のオーバーライドです。したがって、QMainWindow::~QMainWindow()は仮想です。通常のメンバー関数と同じルールが適用されます。

于 2012-10-19T18:07:54.033 に答える
0

これはQtの欠陥です(CBPへの準拠の失敗)。この種の問題を回避するために、すべての派生クラスで、特に仮想の修飾子を常に持ち越すことがベストプラクティスです。

仮想宣言を引き継がないということは、ユーザーとして、クラスだけでなく、その親もすべて検索して、オーバーライドするメソッドが仮想であるかどうかを確認する必要があることを意味します。開発者による少しの怠惰は私に多くの時間を要します。

「保守性」に関する議論は無関係です。それはクラスを使いにくくします(メンテナよりもはるかに多くのユーザーがいるでしょう...)

于 2013-02-13T22:46:57.973 に答える