0

我有一个子类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()为什么?

4

1 回答 1

2

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

如果您想专门调用 QWidget 版本,请更改函数的名称(因此不再隐藏它)或像这样限定调用:

MyDialog::getInstance( myObject )->QWidget::isVisible();
于 2013-07-10T18:27:32.837 回答