c++ - team - Cuando virtual no funciona
tfs 2018 download (2)
Está llamando al método virtual desde el constructor de la clase (a través de otra llamada). Esto llamará al método en la clase actual ya que la subclase aún no se ha construido. La solución es usar un método init () y llamarlo después de construir la clase.
es decir algo como esto:
class wxActivex {
wxActivex() {}
virtual void init() {
getNewFrame();
}
};
// in the code that uses these classes:
wxActivex *activex = new IEHtmlFrame();
activex->init();
Tengo un error extraño en mis clases de C ++ en este momento. Tengo una clase contenedora ActiveX (como parte de wxWidgets) a la que agregué una nueva función virtual. Tengo otra clase que hereda de ActiveX (wxIEHtmlWin), sin embargo, la clase ActiveX siempre llama a su propia función en lugar de la de wxIEHtmlWin que la reemplaza.
No puedo entender por qué sucede esto. Hice la función puramente virtual y ahora el programa falla cuando hace la llamada a la función, pero compila bien de lo contrario. ¿Hay alguna forma de desactivar las funciones virtuales o he encontrado un error en Visual Studio?
Clase ActiveX
protected:
virtual FrameSite* getNewFrameSite()=0;
wxIEHtmlWin clase
class wxIEHtmlWin : public wxActiveX
{
protected:
FrameSite* getNewFrameSite();
}
FrameSite* wxIEHtmlWin::getNewFrameSite()
{
return new gcFrameSite(this);
}
Editar: he agregado otra función de prueba (devuelve un int) y todavía se estropea.
Enlace al código en cuestión: http://lodle.net/public/iebrowser.rar
Editar:
OK gracias a la respuesta a continuación, lo tengo para trabajar. Lo que hice fue crear la clase activex en dos partes (como se sugiere), sin embargo, en wxIEHtmlWin llamé a la segunda parte en el código del constructor. Al igual que:
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();
}
Ahora sé por qué wxWidgets admite la construcción de dos partes.
Una versión más "hervida" de esta pregunta se puede encontrar aquí . Pero, en resumen, el objeto base no es (todavía) una instancia del tipo derivado, por lo que no puede invocar ninguna función sobrecargada en el objeto derivado.