C++ 为什么可以';我调用QWidget::isVisible()的继承版本吗?

C++ 为什么可以';我调用QWidget::isVisible()的继承版本吗?,c++,qt,inheritance,polymorphism,overloading,C++,Qt,Inheritance,Polymorphism,Overloading,我有一个类MyDialog,它是QDialog的子类,它本身是QWidget的子类。看起来是这样的: QObject | V QWidget | V QDialog | V MyDialog 类MyDialog有一个静态方法static bool isVisible(MyObject*MyObject)。它还从其父对象继承实例方法:QWidget::isVisible() 在MyDialog.h中: class MyDialog : public QDial

我有一个类
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();

不管问题的原因是什么,都应该重命名静态方法。这样的名字冲突是不好的做法。@Riateche很高兴知道,谢谢!我会给它改名的