为什么子类

时间:2016-07-13 16:18:39

标签: c++ qt inheritance

我有一个基类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);
    }

但我不明白为什么不这样做。请赐教!

1 个答案:

答案 0 :(得分:1)

除非你在子类的声明中的某处写using Base::load;,否则该子类将无法看到基类中声明的其他load函数。

它是C ++中最初看起来很奇怪的部分之一。