2008-12-24 58 views
3

我在我的C++类目前有一个奇怪的错误。我有一个ActiveX包装类(作为wxWidgets的一部分),我添加了一个新的虚拟功能。我有另一个继承自ActiveX的类(wxIEHtmlWin),但是ActiveX类总是调用它自己的函数,而不是wxIEHtmlWin中的函数来覆盖它。当虚拟不起作用

我不知道为什么会发生这种情况。我将该函数设为纯虚函数,现在程序在执行函数调用时崩溃,否则编译正常。有什么办法可以禁用虚拟功能,或者我在Visual Studio中发现了一个错误吗?

的ActiveX类

protected: 
virtual FrameSite* getNewFrameSite()=0; 

wxIEHtmlWin类

class wxIEHtmlWin : public wxActiveX 
{ 
protected: 
    FrameSite* getNewFrameSite(); 
} 

FrameSite* wxIEHtmlWin::getNewFrameSite() 
{ 
    return new gcFrameSite(this); 
} 

编辑:我添加了另一个测试功能(返回一个int),仍然螺丝了。

链接代码问题:http://lodle.net/public/iebrowser.rar

编辑:

OK感谢回答以下我得到它的工作。我所做的是创建两个部分的activex类(如建议),但在wxIEHtmlWin我调用构造函数代码中的第二部分。像这样:

wxIEHtmlWin::wxIEHtmlWin(wxWindow * parent, wxWindowID id, const wxPoint& pos,const wxSize& size,long style, const wxString& name) : wxActiveX() 
{ 
    wxActiveX::Create(parent, PROGID, id, pos, size, style, name); 
    SetupBrowser(); 
} 

现在我知道为什么wxWidgets支持两部分构造。

+0

我们可以看到整个wxActiveX类(或至少是一个减少,但在一个C++感觉版本中完成,展现了这个问题)?会不会有宏观干扰?如果可能的话,查看预处理文件。 – 2008-12-24 08:14:50

+0

并确保你已经做了一个干净的。 – Artelius 2008-12-24 08:22:07

回答

9

您正在从类的构造函数中调用虚方法(通过另一个调用)。这将调用当前类的方法,因为子类尚未构建。解决方法是使用init()方法并在构造类之后调用它。

即是这样的:

class wxActivex { 
    wxActivex() {} 
    virtual void init() { 
    getNewFrame(); 
    } 
}; 

    // in the code that uses these classes: 
    wxActivex *activex = new IEHtmlFrame(); 
    activex->init(); 
1

这个问题的更“归结”版本可以发现here。但简而言之,基础对象不是(还)派生类型的实例,因此无法在派生对象上调用任何重载函数。

相关问题