<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Vererbung, Compiler ruft falsche Funktion auf]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hatte hier einen komischen Effekt. Habe folgendes gemacht:<br />
Ich habe eine Basisklasse LoSa (kommt von LoadSave) und davon abgeleitet eine Klasse LoadFile. Obwohl MFC Klassen verwendet werden ist es meiner Meinung nach kein typische MFC Problem, da man statt CArchiv genauso auch FILE schreiben könnte (oder jede beliebige andere Struktur/Klasse).</p>
<pre><code>class LoSa 
{
protected:
    /*      Öffnen der Datei über den Dateinamen (inkl. Pfad)
    */
    BOOL	Open(LPCTSTR name, LPCTSTR kennung, LPUBYTE error, HWND win, BOOL writing, BOOL progressBar=FALSE);

    /*      Übergabe des Dateihandles an diese Klasse (die Datei ist bereits durch CreateFile() geöffnet worden)
    */
     :arrow: BOOL    Open(HANDLE hFile, BOOL writing, HWND win);

public:

    LoSa();
    ~LoSa();

    /*      Übergabe eines MFS CArchivs an diese Klasse (die Datei wurde bereits durch die MFC geöffnet)
    */
     :arrow: BOOL 	Open(CArchive *ca, HWND win);
    /*      Datei schließen und interne Strukturen aufrufen. Diese Funktion muß in jedem Fall aufgerufen werden!
    */
    void	Close();
};

class LoadFile : public LoSa
{
public:
    /*      Öffnen der Datei über den Dateinamen (inkl. Pfad)
    */
    BOOL	Open(LPCTSTR name, LPCTSTR kennung, LPUBYTE error, HWND win, BOOL progressBar=FALSE)
            {
                return LoSa::Open(name, kennung, error, win, FALSE, progressBar);
            }

    /*      Übergabe des Dateihandles an diese Klasse (die Datei ist bereits durch CreateFile() geöffnet worden)
    */
     :arrow: BOOL    Open(HANDLE hFile, HWND win)
            {
                return LoSa::Open(hFile, FALSE, win);
            }

};
</code></pre>
<p>Soweit sieht alles ganz normal aus, oder ?</p>
<p>Der Aufruf sieht folgendermaßen aus (Ausschnitt):</p>
<pre><code>void CsamDiaView::Serialize(CArchive&amp; ar)
{
    ......

            LoadFile hd;
             :arrow: hd.Open(&amp;ar,m_hWnd);      // Ab V7
            if (!hd.ok)
                AfxThrowArchiveException(CArchiveException::generic,ar.m_strFileName);

            LoadAppData(&amp;hd, FALSE);
            hd.GetSystemId(); //todo wirklich notwendig ???
            hd.Close();
            ar &gt;&gt; m_BKColorOverrun;

   .....

}
</code></pre>
<p>Ich bin eigentlich davon ausgegangen, dass der Compiler (VC++ 6), das Open() aus der LoSa Klasse aufruft, da ein Pointer auf ein CArchiv angegeben wurde. In Wirklichkeit ruft der Compiler aber weiterhin das Open() aus der LoadFile-Klasse auf, also diese Funktion: Open(HANDLE hFile, HWND win)<br />
Das funktioniert dann natürlich gar nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gelöst habe ich das, indem in der abgeleiteten Klasse nochmal eine spezielle Open-Funktion für das CArchiv angegeben wurde.</p>
<p>Mich würde nur mal interessieren ob ich hier einen Fehler gemacht habe, oder ob der Compiler hier nicht ganz so toll gearbeitet hat. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/148074/vererbung-compiler-ruft-falsche-funktion-auf</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 12:59:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/148074.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 May 2006 09:00:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung, Compiler ruft falsche Funktion auf on Tue, 23 May 2006 09:00:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hatte hier einen komischen Effekt. Habe folgendes gemacht:<br />
Ich habe eine Basisklasse LoSa (kommt von LoadSave) und davon abgeleitet eine Klasse LoadFile. Obwohl MFC Klassen verwendet werden ist es meiner Meinung nach kein typische MFC Problem, da man statt CArchiv genauso auch FILE schreiben könnte (oder jede beliebige andere Struktur/Klasse).</p>
<pre><code>class LoSa 
{
protected:
    /*      Öffnen der Datei über den Dateinamen (inkl. Pfad)
    */
    BOOL	Open(LPCTSTR name, LPCTSTR kennung, LPUBYTE error, HWND win, BOOL writing, BOOL progressBar=FALSE);

    /*      Übergabe des Dateihandles an diese Klasse (die Datei ist bereits durch CreateFile() geöffnet worden)
    */
     :arrow: BOOL    Open(HANDLE hFile, BOOL writing, HWND win);

public:

    LoSa();
    ~LoSa();

    /*      Übergabe eines MFS CArchivs an diese Klasse (die Datei wurde bereits durch die MFC geöffnet)
    */
     :arrow: BOOL 	Open(CArchive *ca, HWND win);
    /*      Datei schließen und interne Strukturen aufrufen. Diese Funktion muß in jedem Fall aufgerufen werden!
    */
    void	Close();
};

class LoadFile : public LoSa
{
public:
    /*      Öffnen der Datei über den Dateinamen (inkl. Pfad)
    */
    BOOL	Open(LPCTSTR name, LPCTSTR kennung, LPUBYTE error, HWND win, BOOL progressBar=FALSE)
            {
                return LoSa::Open(name, kennung, error, win, FALSE, progressBar);
            }

    /*      Übergabe des Dateihandles an diese Klasse (die Datei ist bereits durch CreateFile() geöffnet worden)
    */
     :arrow: BOOL    Open(HANDLE hFile, HWND win)
            {
                return LoSa::Open(hFile, FALSE, win);
            }

};
</code></pre>
<p>Soweit sieht alles ganz normal aus, oder ?</p>
<p>Der Aufruf sieht folgendermaßen aus (Ausschnitt):</p>
<pre><code>void CsamDiaView::Serialize(CArchive&amp; ar)
{
    ......

            LoadFile hd;
             :arrow: hd.Open(&amp;ar,m_hWnd);      // Ab V7
            if (!hd.ok)
                AfxThrowArchiveException(CArchiveException::generic,ar.m_strFileName);

            LoadAppData(&amp;hd, FALSE);
            hd.GetSystemId(); //todo wirklich notwendig ???
            hd.Close();
            ar &gt;&gt; m_BKColorOverrun;

   .....

}
</code></pre>
<p>Ich bin eigentlich davon ausgegangen, dass der Compiler (VC++ 6), das Open() aus der LoSa Klasse aufruft, da ein Pointer auf ein CArchiv angegeben wurde. In Wirklichkeit ruft der Compiler aber weiterhin das Open() aus der LoadFile-Klasse auf, also diese Funktion: Open(HANDLE hFile, HWND win)<br />
Das funktioniert dann natürlich gar nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gelöst habe ich das, indem in der abgeleiteten Klasse nochmal eine spezielle Open-Funktion für das CArchiv angegeben wurde.</p>
<p>Mich würde nur mal interessieren ob ich hier einen Fehler gemacht habe, oder ob der Compiler hier nicht ganz so toll gearbeitet hat. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1063318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1063318</guid><dc:creator><![CDATA[sam123]]></dc:creator><pubDate>Tue, 23 May 2006 09:00:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Compiler ruft falsche Funktion auf on Tue, 23 May 2006 09:14:10 GMT]]></title><description><![CDATA[<p>Überladung betrifft nur Funktionen aus EINEM Namensraum - vererbte Methoden werden von den neuen überdeckt (und sind quasi unsichtbar). Als Lösung könntest du die geerbten Methoden per &quot;using LoSa::Open;&quot; in den Namensraum der abgeleiteten Klasse übernehmen.</p>
<p>(oder dein Design überdenken ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1063339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1063339</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 23 May 2006 09:14:10 GMT</pubDate></item></channel></rss>