<?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[Sinn von Virtual]]></title><description><![CDATA[<p>Guten Abend,<br />
ich versuche glaube ich nun bald seit einem Monat den Sinn von &quot;virtual&quot; zu verstehen in der Polymorphie von C++. Ich weiß das man wenn man in der Basisklasse vor einer Methode &quot;virtual&quot; schreibt, dass sie in einer Unterklasse &quot;überschrieben&quot; werden kann. Ich meine, im folgenden Beispiel geht eine Überschreibung auch ohne virtual.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Basis
{
    public:
        void Methode() { std::cout &lt;&lt; &quot;Moin&quot;; }
};

class Unter : public Basis
{
    public:
        void Methode() { std::cout &lt;&lt; &quot;Moin2&quot;; }
};

int main()
{
    Basis b;
    b.Methode();
    Unter u;
    u.Methode();
}
</code></pre>
<p>Ich habe schon mehrere Tutorials gelesen und versucht zu verstehen, von daher bitte keine Links die ich mit 90% Sicherheit schon gelesen habe. Vielleicht kann es mir jemand bitte kurz und bündig und vielleicht an Hand eines guten Beispiels klarer machen.<br />
Mit freundlichen Grüßen : FreakY</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228003/sinn-von-virtual</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 17:29:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228003.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Nov 2008 17:35:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sinn von Virtual on Sat, 22 Nov 2008 17:37:31 GMT]]></title><description><![CDATA[<p>Guten Abend,<br />
ich versuche glaube ich nun bald seit einem Monat den Sinn von &quot;virtual&quot; zu verstehen in der Polymorphie von C++. Ich weiß das man wenn man in der Basisklasse vor einer Methode &quot;virtual&quot; schreibt, dass sie in einer Unterklasse &quot;überschrieben&quot; werden kann. Ich meine, im folgenden Beispiel geht eine Überschreibung auch ohne virtual.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Basis
{
    public:
        void Methode() { std::cout &lt;&lt; &quot;Moin&quot;; }
};

class Unter : public Basis
{
    public:
        void Methode() { std::cout &lt;&lt; &quot;Moin2&quot;; }
};

int main()
{
    Basis b;
    b.Methode();
    Unter u;
    u.Methode();
}
</code></pre>
<p>Ich habe schon mehrere Tutorials gelesen und versucht zu verstehen, von daher bitte keine Links die ich mit 90% Sicherheit schon gelesen habe. Vielleicht kann es mir jemand bitte kurz und bündig und vielleicht an Hand eines guten Beispiels klarer machen.<br />
Mit freundlichen Grüßen : FreakY</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618979</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sat, 22 Nov 2008 17:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Sat, 22 Nov 2008 17:57:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Unter u;
Basis *p = &amp;u;
p-&gt;Methode();
</code></pre>
<p>Ohne virtual würde hier Basis::Methode() aufgerufen, obwohl wir es ja mit einem Objekt der Klasse &quot;Unter&quot; zu tun haben. Mit virtual wird korrekt Unter::Methode() aufgerufen. Überschreiben ist zwar auch ohne virtual möglich, führt aber selten zum gewünschten Ergebnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618987</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Sat, 22 Nov 2008 17:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Sat, 22 Nov 2008 17:57:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt; 

 using namespace std; 

 class A 
   { 
   public: 
     A(){} 
     ~A(){} 
     void foo() 
       { 
       cout &lt;&lt; &quot;a&quot; &lt;&lt; endl; 
       } 
   }; 

 class B : public A 
   { 
   public: 
     B(){} 
     ~B(){} 
     void foo() 
       { 
       cout &lt;&lt; &quot;b&quot; &lt;&lt; endl; 
       } 
   }; 

 int main() 
   { 
   B b; 
   A&amp; a(b); 
   a.foo(); 
   }
</code></pre>
<p>Ausgabe: a</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

 using namespace std;

 class A
   {
   public:
     A(){}
     virtual ~A(){}
     virtual void foo()
       {
       cout &lt;&lt; &quot;a&quot; &lt;&lt; endl;
       }
   };

 class B : public A
   {
   public:
     B(){}
     ~B(){}
     void foo()
       {
       cout &lt;&lt; &quot;b&quot; &lt;&lt; endl;
       }
   };

 int main()
   {
   B b;
   A&amp; a(b);
   a.foo();
   }
</code></pre>
<p>Ausgabe: b</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618988</guid><dc:creator><![CDATA[JustAnotherNoob]]></dc:creator><pubDate>Sat, 22 Nov 2008 17:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Sat, 22 Nov 2008 18:13:11 GMT]]></title><description><![CDATA[<p>Hm okay vielen dank, ich glaube mit euren Beispielen habe ich einen besseren Einblick bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618995</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sat, 22 Nov 2008 18:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Sun, 23 Nov 2008 03:13:54 GMT]]></title><description><![CDATA[<p>Um verwirrung mal vorzubeugen. Bei der Vererbung gibt es auch ein virtual.</p>
<pre><code class="language-cpp">class a {};
class b : virtual a{}; // virtuelle vererbung
class c : virtual a{}; // virtuelle vererbung

class d : public b , public c {}; // c erbt nur von einem b
</code></pre>
<p><a href="http://en.wikipedia.org/wiki/Diamond_problem" rel="nofollow">http://en.wikipedia.org/wiki/Diamond_problem</a></p>
<p>Hat aber rein gar nichts mit dem zutun, was du gerade machst. Einfach nur, dass du später nicht verwirrt bist, wenn du virtuelle vererbung siehst. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1619155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619155</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 23 Nov 2008 03:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Mon, 24 Nov 2008 13:58:43 GMT]]></title><description><![CDATA[<p>Das Vorteil ist, dass Du ein einheitliches Interface für Tätigkeiten hast. Als Beispiel nehme ich mal das Öffnen von Behältern. Man kann z.B. Flaschen, Kisten etc. öffnen. Das geht aber immer unterschiedlich (aufschrauben, aufklappen usw.). Über virtuelle Funktionen kannst Du den verschienden Behältern eine open-Methode zur Verfügung stellen, die intern das vom jeweiligen Container benötigte tut. Nach außen hin musst Du aber einfach nur open() aufrufen.<br />
Beispiel:</p>
<pre><code class="language-cpp">struct OpenableContainer
{
    virtual void open() = 0;
    virtual ~OpenableContainer(){}
};

class Bottle : public OpenableContainer
{
    //irgendwelcher Bottle-Code
    void open()
    {
        //code zum oeffnen von Flaschen
    }
};

class Box : public OpenableContainer
{
    //irgendwelcher Box-Code
    void open()
    {
        //code zum oeffnen von Kisten
    }
};

class Footlocker : public OpenableContainer
{
    //irgendwelcher Footlocker-Code
    void open()
    {
        //code zum oeffnen von ...Kisten
    }
};

std::vector&lt;OpenableContainer&gt; containers;

containers.push_back(Bottle()); //fuegt eine Buddel ein
containers.push_back(Box()); //und eine Kiste
containers.push_back(Footlocker()); //und noch eine

void open(const std::vector&lt;OpenableContainer&gt;&amp; containers)
{
    //alle Behaelter im Vektor oeffnen
    for(size_t n = 0; n != containers.size(); ++n)
    {
        containers.[i].open(); //hier werden die virtuellen Methoden aufgerufen. Und zwar immer die passenden
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1619912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619912</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 24 Nov 2008 13:58:43 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Mon, 24 Nov 2008 15:15:01 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Beispiel:</p>
<pre><code class="language-cpp">std::vector&lt;OpenableContainer&gt; containers;

containers.push_back(Bottle()); //fuegt eine Buddel ein
containers.push_back(Box()); //und eine Kiste
containers.push_back(Footlocker()); //und noch eine
</code></pre>
</blockquote>
<p>Und genau so geht es nicht. Du kannst schon mal keinen std::vector einer pure virtuell class erzeugen. Und der push_back würde, wenn die abgeleitete Klasse dann mit dem Kopierkonstruktor in die Basisklasse wandeln. Damit wäre die virtuelle Methode auch hinfällig.</p>
<p>Virtuelle Methoden machen nur Sinn, wenn Zeiger oder Referenzen auf Basisklassen verwendet werden, die dann auf Instanzen abgeleiteter Klassen verweisen. Also etwa so:</p>
<pre><code class="language-cpp">std::vector&lt;OpenableContainer*&gt; containers;

containers.push_back(new Bottle()); //fuegt eine Buddel ein
containers.push_back(new Box()); //und eine Kiste
containers.push_back(new Footlocker()); //und noch eine
</code></pre>
<p>Wobei hier der Entwickler für die Aufräumarbeiten mittels delete zuständig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619974</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:15:01 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Mon, 24 Nov 2008 15:25:42 GMT]]></title><description><![CDATA[<p>Jo, stimmt. Hab net ans Slicing gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619984</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von Virtual on Mon, 24 Nov 2008 17:18:33 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Wobei hier der Entwickler für die Aufräumarbeiten mittels delete zuständig ist.</p>
</blockquote>
<p>Um das zu umgehen, kann man beispielsweise <em>Boost.PointerContainer</em> nutzen, da wird automatisch aufgeräumt. Oder man setzt Smart Pointers in Standardcontainern ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620071</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 24 Nov 2008 17:18:33 GMT</pubDate></item></channel></rss>