2016-07-13 2 views
0

私はファイルから保存された設定を読み込む一連のロード機能を提供する基本クラスBaseを持っています。例えば、私のオーバーロードされた関数がサブクラスに見えない理由

void Base::load(QWidget *w); 
virtual void Base::load(QTableWidget *t); // note this is declared virtual 
void Base::load(QLineEdit *le); 

ここで、Base :: load(QWidget * w)は通常、上位レベルウィジェットのサブクラスによって呼び出されます。そのルーチンは入力ウィジェットの子ウィジェットを(型別に)見つけ出し、そのウィジェットに対して適切なロードルーチンを呼び出します。オーバーロードは期待通りに機能します。 だから、サブクラスOkSubClassに、私は通常、このような負荷の操作を行います。

void OkSubClass::load(void) 
{ 
load(myMainWidget); 
load(myOtherHighLevelWidget); 
} 

をすべてが良いです - のいずれかのウィジェットの子であるものがロードされます。

今私はテーブルのために物事を少し異なる方法でロードする必要があるBaseのサブクラスを持っています。それは宣言します

virtual void ProblemSubClass::load(QTableWidget *t) ; 

また、このクラスで使用されるいくつかのウィジェットがフォームクラスを継承しています。例えば

class myWidget: public QWidget, public MyForm { ... }; 

とProblemSubClassは、メンバ変数ルーチンProblemSubClassで今

myWidget *_myMainWidget; 

を持っている::負荷(無効)、私は次の操作を実行しよう:

ProblemSubClass::load(void) 
{ 
    load(_myMainWidget); 
} 

それはそれと文句を言い_myMainWidgetをQTableWidget に変換できません。私はProblemSubClassが負荷(QWidget)メンバ関数を見ることができるはずだと思ったので、私は驚きました。 基本クラス関数を直接呼び出すと動作します。

ProblemSubClass::load(void) 
    { 
     Base::load(_myMainWidget); 
    } 

しかし、なぜ私がそうしないのか分からない。私を教えてください!

+3

コードを単語で記述するのではなく、* code *で記述します。 [最小限で完全で検証可能な例](http://stackoverflow.com/help/mcve)の作成に時間を掛ければ、何が起こっているのかを理解する方がはるかに簡単です。 –

+3

名前が隠れている、https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule –

答えて

1

子クラスの宣言のどこかにusing Base::load;を書き込まない限り、その子クラスは、基底クラスで宣言された他のload関数を見ることができません。

これは、最初は奇妙に見えるC++の部分の1つです。

+0

を参照してください。初めて私はそれを偶然見つけました。私はどれくらいの時間を言うのでしょう。 – mike

+1

私は本当に理解したことがないと告白します。なぜ* C++がこのように動作するのですか? – Bathsheba

+0

これはオーバーロードされた関数にのみ適用されますか?それともそれがバーチャルなのか? – mike

関連する問題