私はファイルから保存された設定を読み込む一連のロード機能を提供する基本クラス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);
}
しかし、なぜ私がそうしないのか分からない。私を教えてください!
コードを単語で記述するのではなく、* code *で記述します。 [最小限で完全で検証可能な例](http://stackoverflow.com/help/mcve)の作成に時間を掛ければ、何が起こっているのかを理解する方がはるかに簡単です。 –
名前が隠れている、https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule –