我对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
的{{1}}方法,它看起来像这样:
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
不应该被排除在外吗?我的意思是,不应该从基类或子类调用该方法,而不是一个接一个地调用两个吗?我在阅读this answer之后注意到了这一点。
构造
initPlot()
答案 0 :(得分:2)
您没有显示构造函数的定义,只是它们的声明。但我非常确定构造函数定义包含您问题的答案。
您可能不知道派生类构造函数在将虚函数定向到派生类之前调用基类构造函数。因此,在基类构造中调用的虚函数(很快将成为派生类的对象)获取该虚函数的基类定义。
答案 1 :(得分:2)
此外,您的构造函数应该是:
// File .h
CEisProject(QWidget *parent = 0);
// File .cpp
CEisProject::CEisProject(QWidget *parent) : CGenericProject(parent)
{
...
}
或者您将无法为派生的小部件提供父级。