我有一个类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()
。为什么?
答案 0 :(得分:2)
当您声明静态函数isVisible
的名称与基类的函数名称相同但签名不同时,您不会重载它,但实际上您隐藏了继承的函数。编译器会看到您的类中实现的函数,但不会看到QWidget中继承的isVisible
函数。
如果您想要专门调用QWidget版本,请更改您的功能名称(因此不再隐藏它)或限定呼叫如下:
MyDialog::getInstance( myObject )->QWidget::isVisible();