为什么我不能调用继承版本的 QWidget::isVisible()?

Why can't I call an inherited version of QWidget::isVisible()?

本文关键字:isVisible QWidget 不能 调用 继承 版本 为什么      更新时间:2023-10-16

我有一个子类MyDialog子类QDialog,它本身子类QWidget。 所以它看起来像这样:

QObject
   |
   V
QWidget
   |
   V
QDialog
   |
   V
MyDialog

MyDialog 具有静态方法static bool isVisible( MyObject *myObject ) 。 它还从其父级继承实例方法:QWidget::isVisible()

在MyDialog.h中:

class MyDialog : public QDialog
{
    static bool isVisible( MyObject *myObject );
    MyDialog *getInstance( MyObject *myObject );
    // other methods
};

在 MyDialog.cpp:

bool MyDialog::isVisible( MyObject *myObject )
{
    // This intended call to QWidget::isVisible() won't compile
    return MyDialog::getInstance( myObject )->isVisible() 
}

这无法编译,并显示以下错误:

src/MyDialog.cxx: In static member function ‘static bool MyDialog::isVisible(MyObject*)’:
src/MyDialog.cxx:67:57: error: no matching function for call to ‘MyDialog::isVisible()’
src/MyDialog.cxx:67:57: note: candidate is:
src/MyDialog.cxx:62:6: note: static bool MyDialog::isVisible(Equipment*)
src/MyDialog.cxx:62:6: note:   candidate expects 1 argument, 0 provided

它似乎试图调用我的静态方法MyDialog::isVisible( MyObject * )而不是与签名匹配的继承QWidget::isVisible()。 为什么?

当您声明静态函数isVisible与基类的函数同名但签名不同时,您不会重载它,但实际上隐藏了继承的函数。编译器看到的是类中实现的函数,但看不到从 QWidget 继承的isVisible函数。

如果你想专门调用QWidget版本,要么更改函数的名称(这样它就不会再隐藏它了(,要么像这样限定调用:

MyDialog::getInstance( myObject )->QWidget::isVisible();