在C ++中调用父构造函数中的重写方法

时间:2014-09-30 16:45:58

标签: c++ inheritance c++11

我有一些代码(C ++ 11),如下所示:

Form.hpp:

class CForm{
public: 
     CForm(int paTemplate);
protected:
     virtual void createFromTemplate(int paTemplate);
}

Dialog.hpp

class CDialog : public CForm {
public:
    CDialog(int paTemplate);
private:
    void createFromTemplate(int paTemplate);
};

Form.cpp

CForm::CForm(int paTemplate){
    createFromTemplate(paTemplate);
}

Dialog.cpp

CDialog::CDialog(int paTemplate) : CForm(paTemplate){
    active = false;
}

我希望我的对话框可以调用它自己的createFromTemplate,这样就可以调用表单createFromTemplate。我怎样才能实现它? (我在CDialog(template);)中致电main

2 个答案:

答案 0 :(得分:3)

这是不可能的 - 当你在构造函数/析构函数中调用虚函数时,来自"这个"的版本。等级或以下被称为。在你的情况下,无论你做什么,它总是会调用CForm :: createFromTemplate()。

点击此链接 - http://www.artima.com/cppsource/nevercall.html - 它是" Effective C ++"的一章。

答案 1 :(得分:0)

这里的问题是CDialog尚未创建(记住类构造顺序:从上到下),因此函数createFromTemplate没有覆盖。

如果您需要该函数是虚拟的,那么我想最好的选择是在CForm中添加一个新的受保护方法(让我们称之为initializeComponent),这应该从{的构造函数中调用{1}}

CDialog

我的2美分