我没有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;
};


它有一个称为virtualinitPlot方法,它看起来像这样:

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();
}

最佳答案

您没有显示构造函数的定义,仅显示了它们的声明。但是我很确定构造函数定义包含您问题的答案。

您可能没有意识到,派生类构造函数在将虚拟函数定向到派生类之前调用​​了基类构造函数。因此,在(即将成为派生类的对象的)基类构造中调用的虚函数获取该虚函数的基类定义。

10-04 10:32