【问题标题】:When virtual doesn't work当虚拟不工作时
【发布时间】:2010-09-28 07:21:33
【问题描述】:

目前我的 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

编辑:

好的,感谢下面的答案,我让它工作了。我所做的是分两部分创建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 支持两部分构造了。

【问题讨论】:

  • 我们能看到整个 wxActiveX 类吗(或者至少是一个被删减的,但在一个 C++ 意义上的版本中是完整的,会出现问题)?会不会有宏干扰?如果可能,请查看预处理文件。
  • 并确保你已经完成了清理工作。
  • 是的,我通常会在出现这样的故障后这样做。没有解决问题。

标签: c++ visual-studio wxwidgets virtual


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    比如这样的:

    class wxActivex {
      wxActivex() {}
      virtual void init() {
        getNewFrame();
      }
    };
    
      // in the code that uses these classes:
      wxActivex *activex = new IEHtmlFrame();
      activex->init();
    

    【讨论】:

    • 嗯,这可能就是原因。我给它一个测试。
    • 谢谢。我认为虚拟类是理所当然的,从没想过在对象被创建之前你就不能在构造函数中使用它们。
    • 是的,这是一个经典的 C++ 陷阱。
    • 我不会在基类构造函数中编写任何特殊代码并设置一个 init 函数 virtual pure 来强制子类实现者以与此答案中所说的相同的方式设置它。
    • 问题是我只需要这个虚函数,如果你正在改变处理activex调用函数的类,否则普通的构造函数就可以了。
    猜你喜欢
    • 2017-10-27
    • 2014-07-04
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多