c++ - tfs 2017 vs 2018 update



Quando virtuale non funziona (2)

Ho un errore strano nelle mie classi C ++ al momento. Ho una classe wrapper ActiveX (come parte di wxWidgets) a cui ho aggiunto una nuova funzione virtuale. Ho un'altra classe che eredita da quella ActiveX (wxIEHtmlWin), tuttavia la classe ActiveX chiama sempre la propria funzione invece di quella in wxIEHtmlWin che la sovrascrive.

Non riesco a capire perché questo sta accadendo. Ho reso la funzione pure virtuale e ora il programma si blocca quando fa la chiamata alla funzione, ma compila bene altrimenti. C'è un modo per disabilitare le funzioni virtuali o ho trovato un bug in Visual Studio?

Classe ActiveX

protected:
virtual FrameSite* getNewFrameSite()=0;

wxIEHtmlWin class

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

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

Modifica: ho aggiunto un'altra funzione di test (restituisce un int) e continua a rovinare.

Link al codice in questione: http://lodle.net/public/iebrowser.rar

Modificare:

OK grazie alla risposta qui sotto ho capito che funziona. Quello che ho fatto è stato creare la classe activex in due parti (come suggerito) tuttavia in wxIEHtmlWin ho chiamato la seconda parte nel codice costruttore. Così:

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();
}

Ora so perché wxWidgets supporta la costruzione in due parti.

https://src-bin.com


Answer #1

Stai chiamando il metodo virtuale dal costruttore della classe (tramite un'altra chiamata). Questo chiamerà il metodo sulla classe corrente in quanto la sottoclasse non è ancora stata costruita. La soluzione è usare un metodo init () e chiamarlo dopo aver costruito la classe.

cioè qualcosa del genere:

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

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

Answer #2

Una versione più "ribassata" di questa domanda può essere trovata qui . Ma in breve, l'oggetto base non è (ancora) un'istanza del tipo derivato, quindi non può chiamare alcuna funzione sovraccaricata sull'oggetto derivato.





virtual