<?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 und Inline]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgende Klassen programmiert:</p>
<pre><code class="language-cpp">#ifndef _PERSON_H
#define	_PERSON_H

#include &lt;string&gt;

class Person {
public:
    Person(const std::string NN, const std::string VN):Nachname(NN),Vorname(VN){}
    virtual ~Person() {}

    const std::string&amp; getNachname() const {return Nachname;}
    const std::string&amp; getVorname() const {return Vorname;}
    inline virtual std::string toString() const=0;

private:
    std::string Nachname;
    std::string Vorname;

};

#endif
</code></pre>
<p>Person.cpp</p>
<pre><code class="language-cpp">#include &quot;Person.h&quot;
#include &lt;string&gt;

using namespace std;

std::string Person::toString() const {
    return (Nachname + &quot;,&quot; + Vorname);
}
</code></pre>
<pre><code class="language-cpp">#ifndef _STUDENTIN_H
#define	_STUDENTIN_H
#include &quot;Person.h&quot;
#include &lt;string&gt;

class StudentIn: public Person {
public:
    StudentIn(const std::string NN, const std::string VN, const std::string Mat)
    :Person(NN,VN), Matrikelnummer(Mat) {}
    virtual ~StudentIn(){}

    virtual std::string toString()  const {
        return Person::toString();
    }

private:
    std::string Matrikelnummer;

};

#endif
</code></pre>
<p>Und zwar bekomme ich zum einen einen Linker Error:</p>
<pre><code>Undefined symbols:
  &quot;Person::toString() const&quot;, referenced from:
      StudentIn::toString() constin main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
</code></pre>
<p>Und dann würde mich noch interessieren, warum ich bei der Virtuellen Methode toStr() den Rückgabewert per Kopie machen muss und es nicht per Referenz geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263117/vererbung-und-inline</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 02:38:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263117.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Mar 2010 09:48:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 09:48:41 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgende Klassen programmiert:</p>
<pre><code class="language-cpp">#ifndef _PERSON_H
#define	_PERSON_H

#include &lt;string&gt;

class Person {
public:
    Person(const std::string NN, const std::string VN):Nachname(NN),Vorname(VN){}
    virtual ~Person() {}

    const std::string&amp; getNachname() const {return Nachname;}
    const std::string&amp; getVorname() const {return Vorname;}
    inline virtual std::string toString() const=0;

private:
    std::string Nachname;
    std::string Vorname;

};

#endif
</code></pre>
<p>Person.cpp</p>
<pre><code class="language-cpp">#include &quot;Person.h&quot;
#include &lt;string&gt;

using namespace std;

std::string Person::toString() const {
    return (Nachname + &quot;,&quot; + Vorname);
}
</code></pre>
<pre><code class="language-cpp">#ifndef _STUDENTIN_H
#define	_STUDENTIN_H
#include &quot;Person.h&quot;
#include &lt;string&gt;

class StudentIn: public Person {
public:
    StudentIn(const std::string NN, const std::string VN, const std::string Mat)
    :Person(NN,VN), Matrikelnummer(Mat) {}
    virtual ~StudentIn(){}

    virtual std::string toString()  const {
        return Person::toString();
    }

private:
    std::string Matrikelnummer;

};

#endif
</code></pre>
<p>Und zwar bekomme ich zum einen einen Linker Error:</p>
<pre><code>Undefined symbols:
  &quot;Person::toString() const&quot;, referenced from:
      StudentIn::toString() constin main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
</code></pre>
<p>Und dann würde mich noch interessieren, warum ich bei der Virtuellen Methode toStr() den Rückgabewert per Kopie machen muss und es nicht per Referenz geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869680</guid><dc:creator><![CDATA[Noob12345]]></dc:creator><pubDate>Tue, 16 Mar 2010 09:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 10:25:03 GMT]]></title><description><![CDATA[<p>inline virtual ... =0. Was?<br />
Lass das inline weg! Das hat da nichts zu suchen und macht auch keinen Sinn. inline kommt bei der Definition hin. Dann hast du auch keinen linker-error mehr.</p>
<p>toStr() erzeugt einen temporören String. Dieser wird zerstört, sobald die Methode abgearbeitet ist. Und ein solches Objkt kann man nicht derferenzieren - existiert ja nimmer! Sollte es funktionier ist das Zufall - undefiniertes Verhalten.<br />
Deshalb muss eine Kopie zurückgegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869694</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 16 Mar 2010 10:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 10:25:11 GMT]]></title><description><![CDATA[<p>Noob12345 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#ifndef _PERSON_H
#define	_PERSON_H
</code></pre>
</blockquote>
<p>Stopp. Du sollst doch nicht eigene Bezeichner benutzen, die mit _ anfangen. Schon gar nicht, wenn danach ein Großbuchstabe folgt. Doppel-Unterstriche sind auch verboten. Diese Bezeichner sind <strong>reserviert</strong>.</p>
<blockquote>
<pre><code class="language-cpp">inline virtual std::string toString() const=0;
</code></pre>
</blockquote>
<p>Prinzipiell müssen inline-Funktionen immer in jeder Übersetzungseinheit definiert werden, wo sie benutzt werden. Du hast die Defition ja nur in einem cpp-File und rufst sie von einem anderen aus auf. Das ist nicht erlaubt.</p>
<p>[quote=&quot;Noob12345&quot;]<br />
Und zwar bekomme ich zum einen einen Linker Error:</p>
<pre><code>Undefined symbols:
  &quot;Person::toString() const&quot;, referenced from:
      StudentIn::toString() constin main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
</code></pre>
<p>Verwundert nicht. Du hast Dich nicht an die inline-Regeln gehalten.</p>
<p>Noob12345 schrieb:</p>
<blockquote>
<p>Und dann würde mich noch interessieren, warum ich bei der Virtuellen Methode toStr() den Rückgabewert per Kopie machen muss und es nicht per Referenz geht.</p>
</blockquote>
<p>Referenz worauf denn? Wenn das, was referenziert wird, lange genug &quot;lebt&quot;, kannst Du auch eine Referenz zurückgeben. Das Ergebnis von Vorname+&quot;,&quot;+Nachname ist ein <strong>temporäres</strong>, im automatischen Speicher lebendes Objekt, Du nicht an eine Referenz binden kannst. Ein Umweg über eine lokale Variable sollte zumindest eine Compiler-Warnung geben; denn Du würdest eine Referenz auf ein lokales Objekt zurückgeben, was nach Ende der Funktion nicht mehr da ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869695</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 16 Mar 2010 10:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 10:38:25 GMT]]></title><description><![CDATA[<p>Also das _... macht meine IDE automatisch, wenn ich eine neue Klasse anlege (NetBeans).</p>
<p>Wie müsste ich das denn inline schreiben, wenn ich es in der cpp definieren will? In der .h das inline weglassen und in der cpp da zuschreiben geht auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869706</guid><dc:creator><![CDATA[Noob12345]]></dc:creator><pubDate>Tue, 16 Mar 2010 10:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 11:05:14 GMT]]></title><description><![CDATA[<p>Noob12345 schrieb:</p>
<blockquote>
<p>Also das _... macht meine IDE automatisch, wenn ich eine neue Klasse anlege (NetBeans).</p>
<p>Wie müsste ich das denn inline schreiben, wenn ich es in der cpp definieren will? In der .h das inline weglassen und in der cpp da zuschreiben geht auch nicht.</p>
</blockquote>
<p>Eine virtuelle Funktion kann nicht inline sein, da erst zur Laufzeit entschieden wird, welcher code ausgeführt wird. Macht null Sinn.<br />
Wenn du eine inline Funktion verwenden möchtest, solltest du die Implementierung im Header haben, nicht im .cpp, denn der Compiler muss die Implementierung kennen um inlinen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869727</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Tue, 16 Mar 2010 11:05:14 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 11:18:21 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Eine virtuelle Funktion kann nicht inline sein, da erst zur Laufzeit entschieden wird, welcher code ausgeführt wird. Macht null Sinn.</p>
</blockquote>
<p>Jein. Die Aussage ist vollkommen korrekt, wenn es sich um polymorphen Zugriff handelt. Da hat der Compiler keine Chance zu inlinen.<br />
Aber zum Glück ist der Compiler nicht doof und erkennt wenn eben kein Polymorpher ZTugriff stattfindet. Z.B. wenn das Objekt im automatischen Speicher liegt. Dann wird sehr wohl geinlined. Also kann ein inline auch bei einer virtuellen Methode Sinn machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869735</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 16 Mar 2010 11:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 11:23:16 GMT]]></title><description><![CDATA[<p>Also geht das inline in diesem Fall nur in der Header Datei? Also in der cpp ist es unmöglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869739</guid><dc:creator><![CDATA[Noob12345]]></dc:creator><pubDate>Tue, 16 Mar 2010 11:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 11:25:19 GMT]]></title><description><![CDATA[<p>Noob12345 schrieb:</p>
<blockquote>
<p>Also geht das inline in diesem Fall nur in der Header Datei? Also in der cpp ist es unmöglich?</p>
</blockquote>
<p>Nicht nur in diesem Fall geht es nicht. Es ist in jedem Fall unmöglich eine Methodendefinition in einer .cpp zu inlinen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869747</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 16 Mar 2010 11:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 11:42:10 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Nicht nur in diesem Fall geht es nicht. Es ist in jedem Fall unmöglich eine Methodendefinition in einer .cpp zu inlinen.</p>
</blockquote>
<p>Stimmt so auch nicht (mehr) ganz. Das Inlining zur Compilezeit ist nicht möglich, wenn der Header in einer anderen ÜE eingebunden wird. Soweit richtig. In derselben ÜE ist es natürlich möglich, und es gibt auch Techniken, die das Inlining während des Linkens und IIRC zum Teil auch noch später ermöglichen.<br />
So oder so ist es aber meistens sinnfrei, inline explizit anzugeben, weil der Compiler selber bestimmt, ob er inlinen kann und möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869769</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 16 Mar 2010 11:42:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 11:42:43 GMT]]></title><description><![CDATA[<p>Ah danke. Wenn mir jetzt noch jemand erklären kann, warum NetBeans falsch definded @default....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869770</guid><dc:creator><![CDATA[Noob12345]]></dc:creator><pubDate>Tue, 16 Mar 2010 11:42:43 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 12:20:38 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Das Inlining zur Compilezeit ist nicht möglich, wenn der Header in einer anderen ÜE eingebunden wird.</p>
</blockquote>
<p>Zum Glück gibt es deshalb ja auch inlining zur Linkzeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>@OP:<br />
inline heisst nicht &quot;diese Funktion inlinen&quot;. inline heisst vereinfacht nur &quot;lass mich diese Funktion in einer Header Datei definieren&quot;. In deinem Fall ist es komplett unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869798</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 16 Mar 2010 12:20:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 12:25:06 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Das Inlining zur Compilezeit ist nicht möglich, wenn der Header in einer anderen ÜE eingebunden wird.</p>
</blockquote>
<p>Zum Glück gibt es deshalb ja auch inlining zur Linkzeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Genau das habe ich doch geschrieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869802</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 16 Mar 2010 12:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Inline on Tue, 16 Mar 2010 12:33:01 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Genau das habe ich doch geschrieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>ja hast du, mein Fehler :o</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869811</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 16 Mar 2010 12:33:01 GMT</pubDate></item></channel></rss>