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很高兴知道,谢谢!我会给它改名的