C ++中的虚方法误解

时间:2015-07-12 11:09:50

标签: c++ qt inheritance virtual

我对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()

2 个答案:

答案 0 :(得分:2)

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

您可能不知道派生类构造函数在将虚函数定向到派生类之前调用​​基类构造函数。因此,在基类构造中调用的虚函数(很快将成为派生类的对象)获取该虚函数的基类定义。

答案 1 :(得分:2)

此外,您的构造函数应该是:

// File .h
CEisProject(QWidget *parent = 0);

// File .cpp
CEisProject::CEisProject(QWidget *parent) : CGenericProject(parent)
{
    ...
}

或者您将无法为派生的小部件提供父级。