<?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[Klassenvererbung..]]></title><description><![CDATA[<p>Uff irgendwie glaub ich hab ich das mit der Vererbung noch nicht ganz kapiert..<br />
Ich bekomme folgende Fehlermeldung:</p>
<blockquote>
<p>[Linker error] undefined reference to `vtable for cStudent'</p>
</blockquote>
<p>Ich wette mein Code strotzt nur so von Fehlern, aber ich wär allen die sich antun würden das mal durchzuschauen und paar Erklärungen bzw Änderungsvorschläge hätten verdammt dankbar.<br />
Bin nämlich schon nahe am Verzweifeln.. <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="😞"
    /> //an der Stelle wäre wohl ein bisschen heulen angebracht</p>
<p>schneuz.. also:<br />
Ich soll eine abstrakte Klasse Person schreiben die als Attribute den Namen hat und dann abgeleitet Student der zusätzlich das Attribut Matrikelnummer hat.<br />
das ganze soll dann in einem vector&lt;cPerson*&gt; diePersonen gespeichert werden..</p>
<p>header datei:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
using std::string;

class cPerson {
      public:
             cPerson();
             cPerson(string Vorname, string Nachname);
             virtual ~cPerson(){}
             virtual string getNachname() const=0;
             virtual void setNachname(string Nachname)=0;
             virtual string toString() const=0;

      protected:
              string itsNachname;
              string itsVorname;
              };

class cStudent : public cPerson {
      public:
             cStudent();
             cStudent(string Vorname, string Nachname);
             string toString();
             string getNachname() const;
             virtual void setNachname(string Nachname);
             virtual string toString() const;

             string itsMatrikel;

             };

class cProfessor : public cPerson {
      public:
             string toString() const;

             string itsLehrgebiet;

             };
</code></pre>
<p>main.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &quot;personen.h&quot; //die Headerdatei
using namespace std;

int main(){
    vector&lt;cPerson*&gt; diePersonen;
    diePersonen.push_back(new cStudent(&quot;blabla&quot;, &quot;oaschkind&quot;));
    cout &lt;&lt; diePersonen[0] &lt;&lt; endl;
    return 0;
}

//----------------------------------------------------------------------------

cPerson::cPerson(): itsVorname(&quot;Max&quot;), itsNachname(&quot;Mustermann&quot;){
                    cout&lt;&lt;&quot;standardkonstr.\n&quot;;
                    }

cPerson::cPerson(string Vorname, string Nachname): itsVorname(Vorname), itsNachname(Nachname){
                        cout&lt;&lt;&quot;konstr.\n&quot;;
                        } 

string cPerson::getNachname() const {
        return itsNachname;
        }

void cPerson::setNachname(string Nachname){
        itsNachname=Nachname;
        }

string cPerson::toString() const {
        return itsVorname+itsNachname; //das ist sicher Blödsinn, habe mir
        }                              //darüber noch keine Gedanken gemacht
                                       //will das später ausgeben
cStudent::cStudent(){
                     cout&lt;&lt;&quot;studstandarkonstr.\n&quot;;
                     }
cStudent::cStudent(string Vorname, string Nachname)//: itsVorname(Vorname), itsNachname(Nachname){
                          {
                          itsVorname=Vorname;
                          itsNachname=Nachname;
                          cout&lt;&lt;&quot;studkonstr.\n&quot;;
                          } 

string cStudent::toString() const {
       }

string cProfessor::toString() const {
       }
</code></pre>
<p>** wer hier angekommen ist kann sich schon als Helden bezeichen, auch wenn er mir nicht helfen kann <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/topic/134158/klassenvererbung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 10:05:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134158.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Jan 2006 00:21:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 00:21:06 GMT]]></title><description><![CDATA[<p>Uff irgendwie glaub ich hab ich das mit der Vererbung noch nicht ganz kapiert..<br />
Ich bekomme folgende Fehlermeldung:</p>
<blockquote>
<p>[Linker error] undefined reference to `vtable for cStudent'</p>
</blockquote>
<p>Ich wette mein Code strotzt nur so von Fehlern, aber ich wär allen die sich antun würden das mal durchzuschauen und paar Erklärungen bzw Änderungsvorschläge hätten verdammt dankbar.<br />
Bin nämlich schon nahe am Verzweifeln.. <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="😞"
    /> //an der Stelle wäre wohl ein bisschen heulen angebracht</p>
<p>schneuz.. also:<br />
Ich soll eine abstrakte Klasse Person schreiben die als Attribute den Namen hat und dann abgeleitet Student der zusätzlich das Attribut Matrikelnummer hat.<br />
das ganze soll dann in einem vector&lt;cPerson*&gt; diePersonen gespeichert werden..</p>
<p>header datei:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
using std::string;

class cPerson {
      public:
             cPerson();
             cPerson(string Vorname, string Nachname);
             virtual ~cPerson(){}
             virtual string getNachname() const=0;
             virtual void setNachname(string Nachname)=0;
             virtual string toString() const=0;

      protected:
              string itsNachname;
              string itsVorname;
              };

class cStudent : public cPerson {
      public:
             cStudent();
             cStudent(string Vorname, string Nachname);
             string toString();
             string getNachname() const;
             virtual void setNachname(string Nachname);
             virtual string toString() const;

             string itsMatrikel;

             };

class cProfessor : public cPerson {
      public:
             string toString() const;

             string itsLehrgebiet;

             };
</code></pre>
<p>main.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &quot;personen.h&quot; //die Headerdatei
using namespace std;

int main(){
    vector&lt;cPerson*&gt; diePersonen;
    diePersonen.push_back(new cStudent(&quot;blabla&quot;, &quot;oaschkind&quot;));
    cout &lt;&lt; diePersonen[0] &lt;&lt; endl;
    return 0;
}

//----------------------------------------------------------------------------

cPerson::cPerson(): itsVorname(&quot;Max&quot;), itsNachname(&quot;Mustermann&quot;){
                    cout&lt;&lt;&quot;standardkonstr.\n&quot;;
                    }

cPerson::cPerson(string Vorname, string Nachname): itsVorname(Vorname), itsNachname(Nachname){
                        cout&lt;&lt;&quot;konstr.\n&quot;;
                        } 

string cPerson::getNachname() const {
        return itsNachname;
        }

void cPerson::setNachname(string Nachname){
        itsNachname=Nachname;
        }

string cPerson::toString() const {
        return itsVorname+itsNachname; //das ist sicher Blödsinn, habe mir
        }                              //darüber noch keine Gedanken gemacht
                                       //will das später ausgeben
cStudent::cStudent(){
                     cout&lt;&lt;&quot;studstandarkonstr.\n&quot;;
                     }
cStudent::cStudent(string Vorname, string Nachname)//: itsVorname(Vorname), itsNachname(Nachname){
                          {
                          itsVorname=Vorname;
                          itsNachname=Nachname;
                          cout&lt;&lt;&quot;studkonstr.\n&quot;;
                          } 

string cStudent::toString() const {
       }

string cProfessor::toString() const {
       }
</code></pre>
<p>** wer hier angekommen ist kann sich schon als Helden bezeichen, auch wenn er mir nicht helfen kann <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/974539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974539</guid><dc:creator><![CDATA[PuppyOnAcid]]></dc:creator><pubDate>Tue, 24 Jan 2006 00:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 07:05:48 GMT]]></title><description><![CDATA[<p>Für eine Klasse mit virtuellen Methoden benötigst du eine vtable (dort steht die Zuordnung der Methodennamen zur jeweiligen Implementierung), die der Compiler idR in die selbe Übersetzungeinheit packt wie die erste virtuelle Methode der jeweiligen Klasse. In deinem Fall wäre das die cStudent::getNachname() (die du aber nicht definiert hast).</p>
<p>PS: Es macht übrigens wenig Sinn, eine pur virtuelle Funktion mit einer Definition (Funktionsrumpf) zu versorgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974617</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Jan 2006 07:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 07:15:32 GMT]]></title><description><![CDATA[<p>ich bin selber kein so großer c++-experte, aber mir ist aufgefallen, daß du die funktionen</p>
<pre><code class="language-cpp">string cPerson::getNachname() const
void cPerson::setNachname(string Nachname)
string cPerson::toString() const
</code></pre>
<p>statt für cPerson für cStudent schreiben mußt. in der klasse cPerson sind diese funktionen schließlich als =0 deklariert.</p>
<pre><code class="language-cpp">return itsVorname+itsNachname;
</code></pre>
<p>sollte eigentlich funktionieren. nur ein leerzeichen dazwischen wäre halt noch sinnvoll.</p>
<p>EDIT: zu spät...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974624</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 24 Jan 2006 07:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 07:22:32 GMT]]></title><description><![CDATA[<p>nochwas: anstelle von</p>
<pre><code class="language-cpp">cout &lt;&lt; diePersonen[0] &lt;&lt; endl;
</code></pre>
<p>muß es</p>
<pre><code class="language-cpp">cout &lt;&lt; diePersonen[0]-&gt;toString() &lt;&lt; endl;
</code></pre>
<p>heißen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974627</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 24 Jan 2006 07:22:32 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 07:26:24 GMT]]></title><description><![CDATA[<p>besser noch: du entfernst das =0. das macht in deinem falle sowieso keinen sinn. und im programm entfernst du dann</p>
<pre><code class="language-cpp">string cStudent::toString() const { 
       } 

string cProfessor::toString() const { 
       }
</code></pre>
<p>diese funktionen werden dann einfach von cPerson geerbt. das ist ja schließlich der sinn von OOP <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/974628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974628</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 24 Jan 2006 07:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 11:04:38 GMT]]></title><description><![CDATA[<p>Danke erst mal für eure Hilfe!!<br />
Mir ist aber einiges noch nicht ganz klar..</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Für eine Klasse mit virtuellen Methoden benötigst du eine vtable (dort steht die Zuordnung der Methodennamen zur jeweiligen Implementierung), die der Compiler idR in die selbe Übersetzungeinheit packt wie die erste virtuelle Methode der jeweiligen Klasse. In deinem Fall wäre das die cStudent::getNachname() (die du aber nicht definiert hast).</p>
</blockquote>
<p>hmm ich dachte dass cStudent das getNachname erbt und ich nicht definieren muss(dachte das is der Sinn dieser Vererbung).<br />
Ist wohl nicht so weils virtuell ist und ich muss es auch in cStudent schreiben oder?? DH ich definiere diese Funktion in der Basisklasse (virtuell) nur damit die Ableitungen auf die Attribute der Basisklasse zugreifen dürfen..<br />
Ich hoffe ich hab das jetzt richtig verstanden..</p>
<blockquote>
<p>PS: Es macht übrigens wenig Sinn, eine pur virtuelle Funktion mit einer Definition (Funktionsrumpf) zu versorgen.</p>
</blockquote>
<p>Ich soll aber eine Standardimplementierung (zumindest für toString) in der Basisklasse schreiben, die den Namen ausgibt</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9573">@Konfusius</a><br />
Ich muss die Klasse cPerson rein abstrakt halten deswegen hab ich alle Funktionen darin rein virtuell gemacht. Auch wenns vielleicht keinen Sinn macht, so ist die Angabe...<br />
Außerdem kommt in</p>
<pre><code class="language-cpp">string cStudent::toString() const { ......
       }
</code></pre>
<p>noch etwas hinein. Soll nämlich dann alle Attribute ausgeben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974774</guid><dc:creator><![CDATA[PuppyOnAcid]]></dc:creator><pubDate>Tue, 24 Jan 2006 11:04:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 11:09:07 GMT]]></title><description><![CDATA[<p>PuppyOnAcid schrieb:</p>
<blockquote>
<p>hmm ich dachte dass cStudent das getNachname erbt und ich nicht definieren muss(dachte das is der Sinn dieser Vererbung).</p>
</blockquote>
<p>cStudent erbt getNachname, richtig. Da Du getNachname aber selbst nochmal definiert, &quot;überschreibst&quot; Du die geerbte Methode mit einer eigenen.</p>
<blockquote>
<p>Ich soll aber eine Standardimplementierung (zumindest für toString) in der Basisklasse schreiben, die den Namen ausgibt</p>
</blockquote>
<p>Entweder implementierung oder =0 (abstrakt), entscheide Dich <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="😉"
    /><br />
Eine abstrakte Implementierung gibbet nich</p>
<blockquote>
<p>Ich muss die Klasse cPerson rein abstrakt halten deswegen hab ich alle Funktionen darin rein virtuell gemacht. Auch wenns vielleicht keinen Sinn macht, so ist die Angabe...</p>
</blockquote>
<p>Widerspricht der Angabe &quot;soll Standardimplementierung enthalten&quot;</p>
<p>Eine rein abstrakte Klasse hat keine Impl, deshalb heisst sie rein abstrakt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974777</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 24 Jan 2006 11:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 11:33:48 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>cStudent erbt getNachname, richtig. Da Du getNachname aber selbst nochmal definiert, &quot;überschreibst&quot; Du die geerbte Methode mit einer eigenen.</p>
</blockquote>
<p>Heißt das wenn ich getNachname in cStudent nicht überschreibe sondern weglasse dann würde es auch funktionieren auch wenn sie in der Basisklasse rein virtuell ist?</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Entweder implementierung oder =0 (abstrakt), entscheide Dich <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="😉"
    /><br />
Eine abstrakte Implementierung gibbet nich</p>
<blockquote>
<p>Ich muss die Klasse cPerson rein abstrakt halten deswegen hab ich alle Funktionen darin rein virtuell gemacht. Auch wenns vielleicht keinen Sinn macht, so ist die Angabe...</p>
</blockquote>
<p>Widerspricht der Angabe &quot;soll Standardimplementierung enthalten&quot;<br />
Eine rein abstrakte Klasse hat keine Impl, deshalb heisst sie rein abstrakt.</p>
</blockquote>
<p>Na toll..<br />
Dann überlegt sich mein Prof. die Angaben so gut wie seine Vorlesung..<br />
Selbst ein Kollege von mir der eigentlich erfahrener c++ Programmierer ist hat gesagt er wird aus den Gedankengängen manchmal nicht schlau, geschweige denn würde irgend etwas verstehen wenn ers nicht schon wüsste..<br />
und das Script ist genauso scheiße..<br />
Deswegen muss ich euch so zuspammen, weil alles kann ich mir leider nicht durch Tutorials aneignen <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/974808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974808</guid><dc:creator><![CDATA[PuppyOnAcid]]></dc:creator><pubDate>Tue, 24 Jan 2006 11:33:48 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 11:41:51 GMT]]></title><description><![CDATA[<p>PuppyOnAcid schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>cStudent erbt getNachname, richtig. Da Du getNachname aber selbst nochmal definiert, &quot;überschreibst&quot; Du die geerbte Methode mit einer eigenen.</p>
</blockquote>
<p>Heißt das wenn ich getNachname in cStudent nicht überschreibe sondern weglasse dann würde es auch funktionieren auch wenn sie in der Basisklasse rein virtuell ist?</p>
</blockquote>
<p>Wenn cPerson::getNachname() <em>pur</em> virtuell ist, wird sich der Compiler beschweren, daß du sie nicht verwenden kannst (unabhängig davon, ob dort eine Implementierung steht) - du benötigst trotzdem noch eine cStudent::getNachname(), die notfalls die Default-Implementation direkt aufrufen kann.</p>
<p>(PS: Die einzige sinnvolle Anwendung von pur virtuell UND definiert sind afaik Destruktoren)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974812</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Jan 2006 11:41:51 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 12:02:12 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(PS: Die einzige sinnvolle Anwendung von pur virtuell UND definiert sind afaik Destruktoren)</p>
</blockquote>
<p>&quot;einzig sinnvoll&quot; halte ich hier für die falsche Bezeichnung. Immerhin müssen pur virtuelle Desktruktoren auch implementiert sein.<br />
Ich finde Implementationen von pur virtuellen Funktion als default-Implemntation durchaus sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974825</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 24 Jan 2006 12:02:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 13:30:56 GMT]]></title><description><![CDATA[<p>Danke Leute, habt mir sehr geholfen!<br />
Es funktioniert wie es soll, welch oh Wunder <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="😉"
    /><br />
Konnte mir das restlich Nötige aus euren comments und den Tutorials zusammenreimen...thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/974937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/974937</guid><dc:creator><![CDATA[PuppyOnAcid]]></dc:creator><pubDate>Tue, 24 Jan 2006 13:30:56 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenvererbung.. on Tue, 24 Jan 2006 18:45:36 GMT]]></title><description><![CDATA[<p>also, ich hab meine c++-kenntnisse aus dem &quot;Breymann&quot;. soll angeblich das c++-standardwerk in deutschland sein. dieses buch ist der letzte müll und deshalb habe ich auch immer noch so ziemlich null ahnung von c++ obwohl ich es vollständig gelesen und auch verstanden habe. wenn diese buch den stand der informatikausbildung in deutschland darstellt, dann gute nacht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975237</guid><dc:creator><![CDATA[Konfusius (off)]]></dc:creator><pubDate>Tue, 24 Jan 2006 18:45:36 GMT</pubDate></item></channel></rss>