<?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[virtuelle Funktion]]></title><description><![CDATA[<p>hallo hallo!<br />
ich beschäftige mich derzeit mit virtuellen funktionen.<br />
habe aber eine explizite frage bzgl. meines Programms.</p>
<p>kurze erläuterung:<br />
ich habe eine basisklasse fahrzeug und leite von ihr die klasse auto ab.<br />
nun will ich ein objekt der klasse auto (also der abgeleiteten klasse) erstellen und mit printAusgabe eine kleine ausgabe schreiben.<br />
mein ziel: ich will über die abgeleitete klasse die ausgabe speziell für diese ausgeben, als auch eine ausgabe in der basisklasse aufrufen.</p>
<p>so das z.b.</p>
<pre><code>class basisklasse
{
    printAusgabe() { cout &lt;&lt; &quot;text der basisklasse&quot;; }
};

class subklasse :: basisklasse
{
    printAusgabe() { cout &lt;&lt; &quot;text der subklasse&quot;; }
};
</code></pre>
<p>es soll also ein objekt der subklasse erstellt werden. dieses übergeb ich an eine print-funktion, welche wiederum auf die jeweiligen printAusgaben() zugreifen. damit das geschieht und der compiler weiß welche klasse, nehme ich ja virtual. so hab ich das zumindest verstanden.</p>
<p>hier nun mein programm:</p>
<pre><code>class CFahrzeug
{
protected:
    int id;
    string name;
    float preis;
public:
    CFahrzeug(); //beide Konstruktorinitialisierungen hab ich jetzt einfach wegen platz weggelassen.
    CFahrzeug(int id, string name, float preis);

    virtual void ausgabe()
    {
        cout &lt;&lt; &quot;ID: &quot; &lt;&lt; id &lt;&lt; &quot; name: &quot; &lt;&lt; name &lt;&lt; &quot; preis: &quot; &lt;&lt; preis &lt;&lt; endl;
    }          
};

class CAuto : public CFahrzeug
{
private:
    string kennzeichen;
public:
    CAuto();
    CAuto(int id, string name, float preis, int raeder, string pkennzeichen) 
                : CFahrzeug(id,name, preis)            
    {

        kennzeichen = pkennzeichen;
    } 
     virtual void ausgabe()
    {
        CFahrzeug::ausgabe();
        cout &lt;&lt; &quot; Kennzeichen: &quot; &lt;&lt; kennzeichen &lt;&lt; endl;
    }
};
CAuto::CAuto()
{
    kennzeichen = &quot;n/a&quot;;
};

void printAusgabe(CFahrzeug test)
{
    test.ausgabe();
}

int main(int argc, char *argv[]) 
{
    CAuto testAuto;
    printAusgabe(testAuto);

    return 0;
}
</code></pre>
<p>ich könnte auch die printAusgabe weglassen und im abgeleiteten objekt einfach in der funktion &quot;ausgabe()&quot; einfach nochmal die ausgabe der basisklasse aufrufen. das erscheint mir einfach logischer.<br />
damit ruft er (bei erstellung eins objekts abgeleiteter klasse) die ausgabe in der subklasse auf und in der steht wieder der aufruf der basisklasse. ergo: ausgabe basis- und subklasse gibt er mir aus.</p>
<p>wenn ich aber wie im beispiel was ich lerne, eine funktion extra anlege die alles ausgeben soll, dann klappts nicht.</p>
<p>mein ergebnis müsste jetzt in der abgespeckten version:<br />
ID: 0 name: n/a preis: 0 sein. //konstruktoren sind natürlich hier weggelassen wegen der &quot;0&quot; jetzt.</p>
<pre><code>void printAusgabe(CFahrzeug test)
{
    test.ausgabe();
}
</code></pre>
<p>hier sage ich ja: nehme das jeweilige obejekt und führe die ausgabe in der jeweiligen klasse aus. CFahrzeug steht ja als basisklasse und durch virtual sollte er die ausgabe ja &quot;durchreichen&quot;.<br />
im skript steht übrigens auch die basisklasse und objekt als parameter. wenn ich als parameter die abgeleitete klasse und objekt nehme, gehts. so will ich es aber halt nicht.<br />
also:<br />
void printAusgabe(CFahrzeug test) // geht nicht<br />
void printAusgabe(CAuto test) // geht</p>
<p>mein gewünschtes ergebnis sollte:<br />
<em>ID: 0 name: n/a preis: 0<br />
Kennzeichen: n/a</em><br />
sein und nicht nur:<br />
<em>ID: 0 name: n/a preis: 0</em></p>
<p>was ist an meinem &quot;virtual&quot; falsch, dass er nur cout der basisklasse ausgibt und nicht das cout der basisklasse und der subklasse?<br />
ich hoffe ihr konntet meiner konfusen beschreibung folgen und wisst was ich meine?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>gruß norben</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323089/virtuelle-funktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 10:24:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323089.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Jan 2014 15:22:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 15:22:04 GMT]]></title><description><![CDATA[<p>hallo hallo!<br />
ich beschäftige mich derzeit mit virtuellen funktionen.<br />
habe aber eine explizite frage bzgl. meines Programms.</p>
<p>kurze erläuterung:<br />
ich habe eine basisklasse fahrzeug und leite von ihr die klasse auto ab.<br />
nun will ich ein objekt der klasse auto (also der abgeleiteten klasse) erstellen und mit printAusgabe eine kleine ausgabe schreiben.<br />
mein ziel: ich will über die abgeleitete klasse die ausgabe speziell für diese ausgeben, als auch eine ausgabe in der basisklasse aufrufen.</p>
<p>so das z.b.</p>
<pre><code>class basisklasse
{
    printAusgabe() { cout &lt;&lt; &quot;text der basisklasse&quot;; }
};

class subklasse :: basisklasse
{
    printAusgabe() { cout &lt;&lt; &quot;text der subklasse&quot;; }
};
</code></pre>
<p>es soll also ein objekt der subklasse erstellt werden. dieses übergeb ich an eine print-funktion, welche wiederum auf die jeweiligen printAusgaben() zugreifen. damit das geschieht und der compiler weiß welche klasse, nehme ich ja virtual. so hab ich das zumindest verstanden.</p>
<p>hier nun mein programm:</p>
<pre><code>class CFahrzeug
{
protected:
    int id;
    string name;
    float preis;
public:
    CFahrzeug(); //beide Konstruktorinitialisierungen hab ich jetzt einfach wegen platz weggelassen.
    CFahrzeug(int id, string name, float preis);

    virtual void ausgabe()
    {
        cout &lt;&lt; &quot;ID: &quot; &lt;&lt; id &lt;&lt; &quot; name: &quot; &lt;&lt; name &lt;&lt; &quot; preis: &quot; &lt;&lt; preis &lt;&lt; endl;
    }          
};

class CAuto : public CFahrzeug
{
private:
    string kennzeichen;
public:
    CAuto();
    CAuto(int id, string name, float preis, int raeder, string pkennzeichen) 
                : CFahrzeug(id,name, preis)            
    {

        kennzeichen = pkennzeichen;
    } 
     virtual void ausgabe()
    {
        CFahrzeug::ausgabe();
        cout &lt;&lt; &quot; Kennzeichen: &quot; &lt;&lt; kennzeichen &lt;&lt; endl;
    }
};
CAuto::CAuto()
{
    kennzeichen = &quot;n/a&quot;;
};

void printAusgabe(CFahrzeug test)
{
    test.ausgabe();
}

int main(int argc, char *argv[]) 
{
    CAuto testAuto;
    printAusgabe(testAuto);

    return 0;
}
</code></pre>
<p>ich könnte auch die printAusgabe weglassen und im abgeleiteten objekt einfach in der funktion &quot;ausgabe()&quot; einfach nochmal die ausgabe der basisklasse aufrufen. das erscheint mir einfach logischer.<br />
damit ruft er (bei erstellung eins objekts abgeleiteter klasse) die ausgabe in der subklasse auf und in der steht wieder der aufruf der basisklasse. ergo: ausgabe basis- und subklasse gibt er mir aus.</p>
<p>wenn ich aber wie im beispiel was ich lerne, eine funktion extra anlege die alles ausgeben soll, dann klappts nicht.</p>
<p>mein ergebnis müsste jetzt in der abgespeckten version:<br />
ID: 0 name: n/a preis: 0 sein. //konstruktoren sind natürlich hier weggelassen wegen der &quot;0&quot; jetzt.</p>
<pre><code>void printAusgabe(CFahrzeug test)
{
    test.ausgabe();
}
</code></pre>
<p>hier sage ich ja: nehme das jeweilige obejekt und führe die ausgabe in der jeweiligen klasse aus. CFahrzeug steht ja als basisklasse und durch virtual sollte er die ausgabe ja &quot;durchreichen&quot;.<br />
im skript steht übrigens auch die basisklasse und objekt als parameter. wenn ich als parameter die abgeleitete klasse und objekt nehme, gehts. so will ich es aber halt nicht.<br />
also:<br />
void printAusgabe(CFahrzeug test) // geht nicht<br />
void printAusgabe(CAuto test) // geht</p>
<p>mein gewünschtes ergebnis sollte:<br />
<em>ID: 0 name: n/a preis: 0<br />
Kennzeichen: n/a</em><br />
sein und nicht nur:<br />
<em>ID: 0 name: n/a preis: 0</em></p>
<p>was ist an meinem &quot;virtual&quot; falsch, dass er nur cout der basisklasse ausgibt und nicht das cout der basisklasse und der subklasse?<br />
ich hoffe ihr konntet meiner konfusen beschreibung folgen und wisst was ich meine?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>gruß norben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377899</guid><dc:creator><![CDATA[Norben]]></dc:creator><pubDate>Fri, 17 Jan 2014 15:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 15:24:14 GMT]]></title><description><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Object_slicing" rel="nofollow">https://en.wikipedia.org/wiki/Object_slicing</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377901</guid><dc:creator><![CDATA[objectslice]]></dc:creator><pubDate>Fri, 17 Jan 2014 15:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 15:28:02 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void printAusgabe(CFahrzeug&amp; test)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2377902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377902</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 17 Jan 2014 15:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 15:37:34 GMT]]></title><description><![CDATA[<p>ach neee oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
extra einen hunderzeiler geschrieben und dann fehlt nur ein &quot;&amp;&quot;?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>vielleicht kann mir der ein oder andere nochmal die zeilen explizit erklären:</p>
<pre><code>void printAusgabe(CFahrzeug&amp; test)
</code></pre>
<p>was genau ist anders als die zeile ohne &quot;&amp;&quot;?<br />
mir schwirrt beim dem kaufmanns-und immer die speicheradresse oder referenz durch den kopf. warum geht es nicht ohne?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377904</guid><dc:creator><![CDATA[Norben]]></dc:creator><pubDate>Fri, 17 Jan 2014 15:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 15:48:19 GMT]]></title><description><![CDATA[<p>Im bereits geposteten Artikel über ObjectSlicing wird es erklärt. Aber ich kanns mal versuchen:</p>
<p>Bei</p>
<pre><code>void printAusgabe(CFahrzeug test) { .. }
</code></pre>
<p>wird beim Aufruf</p>
<pre><code>printAusgabe(testAuto);
</code></pre>
<p>ein neues Objekt der Klasse CFahrzeug erstellt und das Objekt testAuto wird in diese Instanz kopiert. Jetzt hast du aber kein Objekt vom Typ CAuto mehr, sondern ein Objekt vom Typ CFahrzeug (testAuto kann nicht vollständig kopiert werden, da ein Objekt der Klasse CFahrzeug eventuell gar nicht alle Felder der Klasse CAuto besitzt). Folglich wird dann die print-Methode der Klasse CFahrzeug aufgerufen.</p>
<p>Bei</p>
<pre><code>void printAusgabe(CFahrzeug &amp;test) { .. }
</code></pre>
<p>wird beim Aufruf</p>
<pre><code>printAusgabe(testAuto);
</code></pre>
<p>das Objekt nicht kopiert sondern per Referenz uebergeben (stelle dir einfach vor, dass test ein anderer Name fuer testAuto, d.h. es handelt sich um das selbe Objekt). Das heisst test ist (bzw. referenziert) dann noch immer ein Objekt der Klasse CAuto, folglich wird die print-Methode der Klasse CAuto aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377905</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Fri, 17 Jan 2014 15:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 15:53:00 GMT]]></title><description><![CDATA[<p>ich hab mich wohl doch zu früh gefreut.</p>
<p>da ich hier:</p>
<pre><code>virtual void ausgabe() 
    { 
        CFahrzeug::ausgabe();  //vergessen auszukommentieren
        cout &lt;&lt; &quot; Kennzeichen: &quot; &lt;&lt; kennzeichen &lt;&lt; endl; 
    } 
};
</code></pre>
<p>in der abgeleiteten klasse nochmal die ausgabe aus der basisklasse aufrufe gehts.<br />
dies ist unabhängig vom &quot;&amp;&quot; in der zeile:</p>
<pre><code>void printAusgabe(CFahrzeug&amp; test)
</code></pre>
<p>es geht also mit und ohne.</p>
<p>lustig aber:<br />
kommentier ich CFahrzeug::ausgabe(); aus, setze kein &amp; in der zeile void printAusgabe(CFahrzeug&amp; test), dann kommt: ID: 0 name: n/a preis: 0 raus<br />
setze ich das &quot;&amp;&quot; kommt: Kennzeichen: n/a raus.</p>
<p>beide ausgaben aus basis- und subklasse gibt er aber nicht zusammen aus -.-<br />
also immer noch gewünscht:<br />
<em>ID: 0 name: n/a preis: 0 raus<br />
Kennzeichen: n/a</em></p>
<p>kommt nicht heraus <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2377906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377906</guid><dc:creator><![CDATA[Norben]]></dc:creator><pubDate>Fri, 17 Jan 2014 15:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktion on Fri, 17 Jan 2014 16:02:21 GMT]]></title><description><![CDATA[<p>ok. der letzte post war meinerseits bisschen fail, denk ich.<br />
wie soll er auch aus der basisklasse eine funktion aufrufen, wenn man explizit in die subklasse geht und dort kein aufruf von der basis aufruft. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
ich glaube dahingehend hatte ich einen denkfehler.</p>
<p>besten dank soweit.<br />
ich melde mich bestimmt nochmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377908</guid><dc:creator><![CDATA[Norben]]></dc:creator><pubDate>Fri, 17 Jan 2014 16:02:21 GMT</pubDate></item></channel></rss>