我有一个基类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有一个成员变量
myWidget *_myMainWidget;
现在在例程ProblemSubClass :: load(void)中,我尝试执行以下操作:
ProblemSubClass::load(void)
{
load(_myMainWidget);
}
它抱怨它无法将_myMainWidget转换为QTableWidget 。这让我感到惊讶,因为我认为ProblemSubClass应该能够看到加载(QWidget )成员函数。 如果我直接调用基类函数,它的工作原理。
ProblemSubClass::load(void)
{
Base::load(_myMainWidget);
}
但我不明白为什么不这样做。请赐教!
答案 0 :(得分:1)
除非你在子类的声明中的某处写using Base::load;
,否则该子类将无法看到基类中声明的其他load
函数。
它是C ++中最初看起来很奇怪的部分之一。