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

时间:2013-07-10 18:06:16

标签: 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 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()。为什么?

1 个答案:

答案 0 :(得分:2)

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

如果您想要专门调用QWidget版本,请更改您的功能名称(因此不再隐藏它)或限定呼叫如下:

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