Derivec Class + virtual function problem
-
Hallo, ich habe eine Klasse FrameworkElement:
class FrameworkElement { public: FrameworkElement(); virtual void OnRender(); };und zwei abgeleitete Klassen Panel und TextBlock:
class Panel : public FrameworkElement { public: Panel(); std::list<FrameworkElement> m_Children; virtual void OnRender(); }; void Panel::AddChild(FrameworkElement child) { m_Children.push_back(child); } void Panel::OnRender() { for(std::list<FrameworkElement>::iterator it = m_Children.begin(); it != m_Children.end(); ++it) it->OnRender(); }class TextBlock : public FrameworkElement { public: TextBlock(); void OnRender(); };erzeuge ich jetzt im Code einen TextBlock und "adde" diesen im Panel:
m_pMainPanel = new Panel(); m_pTextBlock = new TextBlock(); m_pMainPanel->AddChild(*m_pTextBlock);Dann wird jedoch die OnRender()-Funktion des FrameworkElements aufgerufen und nicht die des TextBlocks, obwohl dies doch gar nicht sein dürfte. Woran kann das liegen? Ich vermute es liegt an der list<FrameworkElement>.
-
Versuchs mal mit einer list aus Zeigern anstatt die Objekte zu kopieren.
-
Ok, habe ich soweit geändert. Die for Schleife schaut jetzt so aus:
for(std::list<FrameworkElement*>::iterator it = m_Children.begin(); it != m_Children.end(); ++it) it->OnRender();Allerdings kommt an der Stelle it->OnRender() jetzt folgende Fehlermeldung:
'OnRender' : is not a member of 'std::_List_iterator<_Mylist>
invalid return type 'FrameworkElement **' for overloaded 'operator ->'Auch
&it->OnRender();
*it->OnRender();
*it.OnRender();
&it.OnRender();hat nicht funktioniert.
-
Priorität von -> über * beachten und Klammern verwenden. Erst den Iterator dereferenzieren, dann Methode aufrufen.
-
Meinst du (*it)->OnRender(); ? Leider stürzt das Programm nun andieser Stelle ab.
-
Geht doch, ich hatte noch was anderes getestet und nicht wieder rückgängig gemacht. Danke dir für die Hilfe.