我没有OOP经验。我正在使用C ++和Qt开发应用程序。我实现了2个类,一个是基类,另一个是从其继承的类。然后,我为两者添加了虚拟方法,并且一切正常。但是后来我意识到我不应该这样做...这是示例:
这是我的基类:
namespace Ui {
class CGenericProject;
}
class CGenericProject : public QDialog
{
Q_OBJECT
public:
explicit CGenericProject(QWidget *parent = 0);
~CGenericProject();
EMeasures_t type();
private:
Ui::CGenericProject *ui;
virtual void initPlot();
protected:
QCustomPlot* customPlot;
QVector<double> m_x;
QVector<double> m_y;
EMeasures_t m_type;
};
它有一个称为
virtual
的initPlot
方法,它看起来像这样:void CGenericProject::initPlot()
{
customPlot = ui->workPlot;
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes );
customPlot->setFocusPolicy(Qt::ClickFocus);
customPlot->xAxis->setAutoTickStep(false);
customPlot->yAxis->setAutoTickStep(false);
customPlot->xAxis->setTickStep(100);
customPlot->yAxis->setTickStep(100);
customPlot->xAxis->setRange(0, 1000);
customPlot->yAxis->setRange(0, 1000);
}
然后我有一个派生它的类:
class CEisProject : public CGenericProject
{
public:
CEisProject();
~CEisProject();
private:
virtual void initPlot();
void exampleEisMethod();
};
它的
initPlot
在这里:void CEisProject::initPlot()
{
// give the axes some labels:
customPlot->xAxis->setLabel("Re [Ohm]");
customPlot->yAxis->setLabel("- Im [Ohm]");
customPlot->replot();
}
这就是我创建对象的方式:
CGenericProject* test = new CEisProject();
现在,当调用
initPlot()
方法时,首先调用基类initPlot()
中的CGenericProject
,然后调用initPlot()
中的CEisProject
。我想要此功能,在这里我可以预定义泛型类中的某些内容,然后在子级中添加特定的内容。但是,当我想到它时,难道不应该叫
initPlot()
吗?我的意思是,该方法不应该一个接一个地从基类或子类中而不是从两者中调用吗?在阅读this answer之后,我注意到了这一点。构造函数:
CGenericProject::CGenericProject(QWidget *parent) :
QDialog(parent),
ui(new Ui::CGenericProject)
{
ui->setupUi(this);
initPlot();
m_x.clear();
m_y.clear();
}
CEisProject::CEisProject()
{
m_type = EMeasures_t::eEIS;
initPlot();
}
最佳答案
您没有显示构造函数的定义,仅显示了它们的声明。但是我很确定构造函数定义包含您问题的答案。
您可能没有意识到,派生类构造函数在将虚拟函数定向到派生类之前调用了基类构造函数。因此,在(即将成为派生类的对象的)基类构造中调用的虚函数获取该虚函数的基类定义。