0

MyDialogサブクラス化するクラスがQDialogあり、それ自体がサブクラス化しQWidgetます。したがって、次のようになります。

QObject
   |
   V
QWidget
   |
   V
QDialog
   |
   V
MyDialog

クラスMyDialogには static メソッドがあります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 に答える