<?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 Konstruktoren]]></title><description><![CDATA[<p>Hallo ihr lieben,</p>
<p>ich habe mal wieder ein paar Verständnisfragen <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><strong>ERSTENS:</strong><br />
Die Fehlerausgabe:<br />
<a href="http://codepad.org/BPgAGmqo" rel="nofollow">http://codepad.org/BPgAGmqo</a></p>
<p><em>cc1plus: warnings being treated as errors<br />
t.cpp: In constructor 'viereck::viereck(int, int, int, int)':<br />
Line 26: warning: 'viereck::a2' will be initialized after<br />
Line 20: warning: base 'punkt'<br />
Line 20: warning: when initialized here<br />
t.cpp: In copy constructor 'viereck::viereck(const viereck&amp;)':<br />
Line 21: warning: base class 'class punkt' should be explicitly initialized in the copy constructor</em></p>
<p>Warum wird a2 später initialisiert, aber a1 macht keine Probleme?<br />
Ich hab an das Bindungsproblem gedacht. Aber ich kann einen Konstruktor doch nicht virtual machen, eine andere Funktion hab ich doch nicht...</p>
<p><strong>ZWEITENS:</strong><br />
Belehrt wurde ich hier von der Dreierregel. <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="🙂"
    /><br />
Während es in der Klasse punkt kein Problem ist, wie komme ich im Kopierkonstruktor von viereck an den Konstruktor von punkt?</p>
<p><strong>DRITTENS:</strong><br />
Der Destruktor von viereck. Ich bin immer skeptisch, wenn ich den ohne Argumente aufrufe. Aber hier rufe ich ja auch den Konstruktor einer anderen Klasse auf, mein Gefühl sagt mir, dass ich da noch was tun muss ... ?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class punkt{
public:
    punkt(int px=0, int py=0): x(px),y(py) {++zaehl; stelle=zaehl;}
    punkt(const punkt&amp; other): x(other.x),y(other.y) {++zaehl;}
    ~punkt() {--zaehl;}
    void verschiebe(int dx, int dy);
    void ausgabe();
private:
    int stelle;
    static int zaehl;		
    int x,y;
};

class viereck : public punkt {
public:
    viereck(int pa=1, int pb=1, int px=0, int py=0) : a1(pa), a2(pb), punkt(px,py) {}
    viereck(const viereck &amp;other):a1(other.a1),a2(other.a2) {}      // wie kommt der Punkt Konstruktor hier rein?
    ~viereck() {}               // muss da irgendwas mit delete rein? Kann das leer bleiben?
    void ausgabe();
private:
    int a1;
    int a2;
};

int main(int count, char **args) {

    std::vector&lt;punkt&gt; test;
    test.push_back(punkt(2,3));
    test.push_back(punkt(1,1));
    test.push_back(punkt(2,6));
    test[0].ausgabe();
    test.clear();
    test.push_back(punkt(5,5));
    test[0].ausgabe();

    std::vector&lt;viereck&gt; test2;
    test2.push_back(viereck(4,6,8,8));
    test2[0].ausgabe();

    return 0;
}

void viereck::ausgabe() {
    std::cout &lt;&lt; a1 &lt;&lt;'x' &lt;&lt; a2 &lt;&lt; ' ' ;
    punkt::ausgabe();
}

int punkt::zaehl=0;

void punkt::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void punkt::ausgabe() {
	std::cout &lt;&lt; zaehl &lt;&lt; &quot; [&quot; &lt;&lt; stelle &lt;&lt; &quot;] Punkt &quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; '\n';
}
</code></pre>
<p>Ich bedanke mich wie immer für die tolle Hilfe! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/320665/vererbung-und-konstruktoren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 15:31:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320665.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Oct 2013 11:14:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 11:14:20 GMT]]></title><description><![CDATA[<p>Hallo ihr lieben,</p>
<p>ich habe mal wieder ein paar Verständnisfragen <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><strong>ERSTENS:</strong><br />
Die Fehlerausgabe:<br />
<a href="http://codepad.org/BPgAGmqo" rel="nofollow">http://codepad.org/BPgAGmqo</a></p>
<p><em>cc1plus: warnings being treated as errors<br />
t.cpp: In constructor 'viereck::viereck(int, int, int, int)':<br />
Line 26: warning: 'viereck::a2' will be initialized after<br />
Line 20: warning: base 'punkt'<br />
Line 20: warning: when initialized here<br />
t.cpp: In copy constructor 'viereck::viereck(const viereck&amp;)':<br />
Line 21: warning: base class 'class punkt' should be explicitly initialized in the copy constructor</em></p>
<p>Warum wird a2 später initialisiert, aber a1 macht keine Probleme?<br />
Ich hab an das Bindungsproblem gedacht. Aber ich kann einen Konstruktor doch nicht virtual machen, eine andere Funktion hab ich doch nicht...</p>
<p><strong>ZWEITENS:</strong><br />
Belehrt wurde ich hier von der Dreierregel. <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="🙂"
    /><br />
Während es in der Klasse punkt kein Problem ist, wie komme ich im Kopierkonstruktor von viereck an den Konstruktor von punkt?</p>
<p><strong>DRITTENS:</strong><br />
Der Destruktor von viereck. Ich bin immer skeptisch, wenn ich den ohne Argumente aufrufe. Aber hier rufe ich ja auch den Konstruktor einer anderen Klasse auf, mein Gefühl sagt mir, dass ich da noch was tun muss ... ?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class punkt{
public:
    punkt(int px=0, int py=0): x(px),y(py) {++zaehl; stelle=zaehl;}
    punkt(const punkt&amp; other): x(other.x),y(other.y) {++zaehl;}
    ~punkt() {--zaehl;}
    void verschiebe(int dx, int dy);
    void ausgabe();
private:
    int stelle;
    static int zaehl;		
    int x,y;
};

class viereck : public punkt {
public:
    viereck(int pa=1, int pb=1, int px=0, int py=0) : a1(pa), a2(pb), punkt(px,py) {}
    viereck(const viereck &amp;other):a1(other.a1),a2(other.a2) {}      // wie kommt der Punkt Konstruktor hier rein?
    ~viereck() {}               // muss da irgendwas mit delete rein? Kann das leer bleiben?
    void ausgabe();
private:
    int a1;
    int a2;
};

int main(int count, char **args) {

    std::vector&lt;punkt&gt; test;
    test.push_back(punkt(2,3));
    test.push_back(punkt(1,1));
    test.push_back(punkt(2,6));
    test[0].ausgabe();
    test.clear();
    test.push_back(punkt(5,5));
    test[0].ausgabe();

    std::vector&lt;viereck&gt; test2;
    test2.push_back(viereck(4,6,8,8));
    test2[0].ausgabe();

    return 0;
}

void viereck::ausgabe() {
    std::cout &lt;&lt; a1 &lt;&lt;'x' &lt;&lt; a2 &lt;&lt; ' ' ;
    punkt::ausgabe();
}

int punkt::zaehl=0;

void punkt::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void punkt::ausgabe() {
	std::cout &lt;&lt; zaehl &lt;&lt; &quot; [&quot; &lt;&lt; stelle &lt;&lt; &quot;] Punkt &quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; '\n';
}
</code></pre>
<p>Ich bedanke mich wie immer für die tolle Hilfe! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2358510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358510</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 07 Oct 2013 11:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 11:31:10 GMT]]></title><description><![CDATA[<p>Oh, je. Das <a href="http://www.c-plusplus.net/forum/75672" rel="nofollow">Wurstbrot</a> ist wieder der <a href="http://www.c-plusplus.net/forum/272350" rel="nofollow">Supermarkt</a>. <code>class viereck : public punkt</code> ? Das bedeutet so viel wie &quot;ein viereck ist ein punkt&quot;. Ist das wohl wirklich eine gute Idee? Wo hast du Vererbung gelernt?</p>
<p>Zu deinen sonstigen Fragen:<br />
-Die Initialisierungsreihenfolge ist völlig unabhängig von der Reihenfolge in der Initialisierungsliste. Sie ist eindeutig festgelegt durch:<br />
-Zuerst alle Basisklassen (ich meine aus dem Kopf heraus von rechts nach links, aber wenn du wirklich Mehrfachvererbung nutzt, dann guckst du lieber nochmal nach)<br />
-Dann die Member, in der Reihenfolge, wie sie in der Klassendefiniton stehen<br />
-Diese Regeln werden rekursiv angewandt</p>
<p>Beim Destruktor geht es genau umgekehrt.</p>
<p>-Der Punktkonstruktor im Kopierkonstruktor kannst du so aufrufen:<br />
<code>viereck(const viereck &amp;other):punkt(other),a1(other.a1),a2(other.a2) {}</code><br />
Das geht, weil bei dir ein viereck auch ein punkt ist und other ist daher auch ein punkt. Ich hoffe du merkst, was das für ein unsinniges Design ist.</p>
<blockquote>
<p>// muss da irgendwas mit delete rein? Kann das leer bleiben?</p>
</blockquote>
<p>Ich glaube, du hast den Sinn von Destruktoren und Konstruktoren noch nicht verstanden. Und auch nicht den der Dreierregel. Du brauchst hier weder Kopierkonstruktor noch Destruktor. Du hast hier bloß die &quot;special member functions&quot; nachgebaut, die auch automatisch erzeugt worden wären.</p>
<p>Destruktoren ruft man <strong>immer</strong> ohne Argumente auf. Nein, besser noch sollte ich sagen: Destruktoren ruft man <strong>nie</strong> auf.<br />
~(außer in ganz wenigen Spezialfällen, die dir nie begegnen werden)~</p>
<p>Womit lernst du C++?</p>
<p>P.S.: Ich habe doch neulich schon den Thread von Herrn Bebel heraus gesucht. War das nicht für dich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358516</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Oct 2013 11:31:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 11:59:58 GMT]]></title><description><![CDATA[<p>nein nein nein ... *lach* kein Jürgen Wolf Buch!<br />
Ich mache das erst seit einer Woche und davon hab ich das Wochenende gerade pausiert. <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="🙂"
    /><br />
Ich dachte mir: ok ein Viereck hat eine Koordinate links unten und dann brauch ich nur noch die Seitenlänge. Dann brauch ich für einen Kreis nur einen Mittelpunkt und einen Radius, usw. Immerhin haben alle geometischen Objekte sowas gemeinsam.<br />
Aber das Auto/Motor Beispiel war gut!! <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="😃"
    /> (Tatsächlich komme ich von C)</p>
<p>Ich teste grad einfach so rum, zum Verständnis. <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="🙂"
    /><br />
Ich hab das Stroustrup Buch zum Nachschlagen. Außerdem das &quot;Thinking in C++&quot;.<br />
Aber ich bin grad ein bisschen von Kapitel zu Kapitel gesprungen. Wenn mir eine Frage in den Kopf kommt, dann probiere ich das erstmal aus! Vieles passiert intuitiv und dann kommt auch schonmal murks raus! <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>Die anderen Anmerkungen werde ich jetzt nachlesen. <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="🙂"
    /> DANKE!</p>
<p>PS: Bebel? Nein, nicht dass ich wüsste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358524</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 07 Oct 2013 11:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 13:07:45 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>Ich dachte mir: ok ein Viereck hat eine Koordinate links unten und dann brauch ich nur noch die Seitenlänge. Dann brauch ich für einen Kreis nur einen Mittelpunkt und einen Radius, usw. Immerhin haben alle geometischen Objekte sowas gemeinsam.</p>
</blockquote>
<p>Über dieses Problem sind schon vorher einige Leute gestolpert. Es gibt sogar einen Wikipedia-Eintrag dazu: <a href="http://en.wikipedia.org/wiki/Circle-ellipse_problem" rel="nofollow">Kreis-Ellipse-Problem.</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358543</guid><dc:creator><![CDATA[ananas]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:07:45 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 13:18:23 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>Ich dachte mir: ok ein Viereck <strong>hat</strong> eine Koordinate links unten und dann brauch ich nur noch die Seitenlänge...</p>
</blockquote>
<p>Grundsätzlich habe ich mal ein Wort hervorgehoben. Ich kenne sehr viele die Vererbung immer zum sparen von Code verwenden, am Schluss damit aber sehr unflexible Strukturen haben (Einen solchen Fall haben wir auch an mehreren Stellen in unseren Projekt, aber die Erkenntnis ist beim Chef noch nicht so ganz angekommen, obwohl jeder andere Entwickler mit dem Konstrukt massive Probleme hat - u.a. wenn wir etwas in diese Hierarchie einpflegen müssen).</p>
<p>Man sollte bei Vererbung nach Möglichkeit das <a href="http://de.wikipedia.org/wiki/Liskovsches_Substitutionsprinzip" rel="nofollow">Liskovsches Substitutionsprinzip</a> berücksichtigen. Stark zusammengefasst: Nutze Vererbung nur, wenn du auch sagen kannst &quot;IST EIN&quot;. Es gibt Ausnahmen, aber die sollte man sich gut überlegen und nicht nur wegen Schreibfaulheit nutzen.</p>
<p>Grundsätzlich sollte man starke Bindung nur mit Bedacht verwenden; Vererbung gilt in vielen Sprachen als die stärkste Form der Bindung (in C++ ist friend noch stärker). &quot;HAT&quot; deutet immer auf Komposition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358550</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 13:45:26 GMT]]></title><description><![CDATA[<blockquote>
<p>-Zuerst alle Basisklassen</p>
</blockquote>
<p>Ja, von Rechts nach Links:</p>
<blockquote>
<p>Bases and members are destroyed in the reverse order of the completion of their constructor</p>
</blockquote>
<p>Und hier die Reihenfolge des Konstruktors (die gleichzeitig auch die umgekehrte Reihenfolge des Destruktors ist):</p>
<p>§12.6.2/10 schrieb:</p>
<blockquote>
<p>In a [..] constructor, initialization proceeds in the following order:<br />
— First, and only for the constructor of the most derived class (1.8), virtual base classes are initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base classes, where “left-to-right” is the order of appearance of the base classes in the derived class base-specifier-list.<br />
— <strong>Then, direct base classes are initialized in declaration order as they appear in the base-specifier-list (regardless of the order of the mem-initializers).</strong><br />
— Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).<br />
— Finally, the compound-statement of the constructor body is executed.</p>
</blockquote>
<blockquote>
<p>Das Wurstbrot ist wieder der Supermarkt.</p>
</blockquote>
<p><s>Vice versa - Supermarkt leitet von Wurstbrot ab.</s> Aufpassen in welches Wurstbrot du beißt - es könnte aus Beton bestehen.<br />
Edit: Nein - <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> - es war schon richtig, Wurstbrot von Supermarkt. Wie Bashar schon richtig formulierte:</p>
<p>Bashar schrieb:</p>
<blockquote>
<p>Wurst erbt dann auch noch virtual vom Supermarkt, dann macht er daraus ein deadly WurstBrot of death</p>
</blockquote>
<p>Nun, egal wie herum, ist beides Unsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358552</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 13:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 15:52:34 GMT]]></title><description><![CDATA[<p>Da wollte ich mir ein einfaches Beispiel zum Verständnis konstruieren und lerne dabei wie es nicht geht! <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 />
Ihr seid spitze! Vielen Dank! <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>Übrigens, wenn ich die Vererbung wegmache, sieht es so aus:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class viereck {
public:
    viereck(int pa=1, int pb=1, int px=0, int py=0) : a1(pa), a2(pb), x(px), y(py) {++zaehl; stelle=zaehl;}
    viereck(const viereck &amp;other): a1(other.a1),a2(other.a2), x(other.x), y(other.y) {++zaehl;}
    ~viereck() {--zaehl;}
    void verschiebe(int dx, int dy);
    void ausgabe();
private:
    int a1;
    int a2;
	int stelle;
	static int zaehl;		// Anzahl der Elemente
    int x,y;                // Koordinaten
};

class kreis {
public:
    kreis(int pr=1, int px=0, int py=0) : r(pr), x(px), y(py) {++zaehl; stelle=zaehl;}
    kreis(const kreis &amp;other): r(other.r), x(other.x), y(other.y) {++zaehl;}
    ~kreis() {--zaehl;}
    void verschiebe(int dx, int dy);
    void ausgabe();
private:
    int r;      // Radius
	int stelle;
	static int zaehl;		// Anzahl der Elemente
    int x,y;                // Koordinaten
};

int main(int count, char **args) {

    std::vector&lt;viereck&gt; test2;
    test2.push_back(viereck(4,6,8,8));
    test2[0].ausgabe();
    std::vector&lt;kreis&gt; test;
    test.push_back(kreis(5,7,9));
    test[0].ausgabe();
	return 0;
}

void viereck::ausgabe() {
    std::cout &lt;&lt; &quot;Viereck: &quot; &lt;&lt; a1 &lt;&lt; 'x' &lt;&lt; a2 &lt;&lt; &quot; #&quot; &lt;&lt; zaehl &lt;&lt; &quot; [&quot; &lt;&lt; stelle &lt;&lt; &quot;] Koordinate (&quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; &quot;) \n&quot;;
}

void kreis::ausgabe() {
    std::cout &lt;&lt; &quot;Kreis: &quot; &lt;&lt; r &lt;&lt; &quot; #&quot; &lt;&lt; zaehl &lt;&lt; &quot; [&quot; &lt;&lt; stelle &lt;&lt; &quot;] Koordinate (&quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; &quot;) \n&quot;;
}

int viereck::zaehl=0;
int kreis::zaehl=0;

void viereck::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void kreis::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}
</code></pre>
<p>Beide Klassen benutzen x und y Koordinaten und eine Funktion verschiebe() die das selbe tut. Ich hätte gedacht, sowas kann man elegant zusammen fassen.<br />
(ok, ich bin wohl noch nicht soweit. Aber interessant ist es schon! <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>PS: Für Vererbung werde ich nochmal genauer in den Büchern lesen. Komme grad aus der Bibliothek und habe deren Bestand mal auseinander genommen und noch C++ Primer, Der C++ Programmierer und Effektiv C++ Programmieren (Scott Meyers) mitgenommen. <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="🙂"
    /> Literatur kann man nie genug haben! ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358613</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 07 Oct 2013 15:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 16:18:59 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>Beide Klassen benutzen x und y Koordinaten und eine Funktion verschiebe() die das selbe tut. Ich hätte gedacht, sowas kann man elegant zusammen fassen.</p>
</blockquote>
<p>Richtig. Dieses gemeinsame Subset an Funktionalität ergibt aber kein vollständiges geom. Objekt, es ist eine Abstraktion. Nicht zufällig, sind Basisklassen in solche Hierarchien daher normalerweise abstrakt, der Versuch von einer konkreten Klasse abzuleiten (also einer Klasse, von der Objekte existieren, die nicht Basisklassensubobjekte eines anderen Objektes sind), ist praktisch immer ein Fehler.<br />
Das könnte dann zum Beispiel so aussehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

class shape {
public:
    shape(int x, int y, int* zaehler) : x(x), y(y), stelle(++*zaehler), zaehler(zaehler) {}
    shape(const shape&amp; other) : x(other.x), y(other.y), stelle(++*other.zaehler), zaehler(other.zaehler) {}
// C++11
//    shape(const shape&amp; other) : shape(other.x, other.y, other.zaehler) {}
protected:
    shape&amp; operator=(const shape&amp; other)
    {
        x = other.x;
        y = other.y;
        return *this;
    }
public:
    virtual ~shape() { --*zaehler; };
    virtual void verschiebe(int dx, int dy);
    virtual void ausgabe() = 0;
protected:
    int x;
    int y;
    int stelle;
    int* zaehler;
};

void shape::verschiebe(int dx, int dy) {
    x = dx;
    y = dy;
};

class viereck : public shape {
public:
    viereck(int pa=1, int pb=1, int px=0, int py=0) : shape(px, py, &amp;zaehl), a1(pa), a2(pb) {}
    void ausgabe();
private:
    int a1;
    int a2;
    static int zaehl;            // Anzahl der Elemente
};

class kreis : public shape {
public:
    kreis(int pr=1, int px=0, int py=0) : shape(px, py, &amp;zaehl), r(pr) {}
    void ausgabe();
private:
    int r;                       // Radius
    static int zaehl;            // Anzahl der Elemente
};

int main(int count, char **args) {

    std::vector&lt;viereck&gt; test2;
    test2.push_back(viereck(4,6,8,8));
    test2[0].ausgabe();
    std::vector&lt;kreis&gt; test;
    test.push_back(kreis(5,7,9));
    test[0].ausgabe();
    return 0;
}

void viereck::ausgabe() {
    std::cout &lt;&lt; &quot;Viereck: &quot; &lt;&lt; a1 &lt;&lt; 'x' &lt;&lt; a2 &lt;&lt; &quot; #&quot; &lt;&lt; zaehl &lt;&lt; &quot; [&quot; &lt;&lt; stelle &lt;&lt; &quot;] Punkt &quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; '\n';
}

void kreis::ausgabe() {
    std::cout &lt;&lt; &quot;Kreis: &quot; &lt;&lt; r &lt;&lt; &quot; #&quot; &lt;&lt; zaehl &lt;&lt; &quot; [&quot; &lt;&lt; stelle &lt;&lt; &quot;] Punkt &quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; '\n';
}

int viereck::zaehl=0;
int kreis::zaehl=0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2358620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358620</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 07 Oct 2013 16:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 16:18:10 GMT]]></title><description><![CDATA[<p>es wurde nun bestimmt schon 10 mal in 10 threads gesagt: rule of three<br />
ohne bringt dein instance-counter nicht viel...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358623</guid><dc:creator><![CDATA[text2121]]></dc:creator><pubDate>Mon, 07 Oct 2013 16:18:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 16:40:24 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>Übrigens, wenn ich die Vererbung wegmache, sieht es so aus:</p>
<pre><code>class viereck {
...
};

class kreis {
...
};
</code></pre>
</blockquote>
<p>Wo ist hier (d)eine Vererbung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358643</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Mon, 07 Oct 2013 16:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 16:45:02 GMT]]></title><description><![CDATA[<p>wow, camper. Vielen Dank!<br />
Ich versuche zu entschlüsseln: <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>
<pre><code>protected:
    shape&amp; operator=(const shape&amp; other)
    {
        x = other.x;
        y = other.y;
        return *this;
    }
</code></pre>
<p>Das ist der Zuweisungsoperator nehme ich an? Im anderen Thread bin ich schon darüber gestolpert, <a href="http://www.c-plusplus.net/forum/320543-17" rel="nofollow">aber das damalige Beispiel brauchte keinen.</a><br />
Jetzt braucht es doch einen?</p>
<blockquote>
<p>Nicht zufällig, sind Basisklassen in solche Hierarchien daher normalerweise abstrakt,</p>
</blockquote>
<p>Merke: versuche keine sprachlogischen Probleme bei Vererbung zu erzeugen. Fürs Verständnis des Quellcodes.<br />
Hat aber noch mehr Gründe nehme ich an ... ?<br />
Eigentlich ist diese Shape Klasse ja genau das, was ich mit meiner Punkt Klasse wollte, es aber nicht hinbekommen habe <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="😉"
    /> Sie heißt anders und schon gibts kein &quot;Ist-Ein&quot; Problem.</p>
<pre><code>virtual ~shape() { --*zaehler; };
</code></pre>
<p>warum ist der Destruktor virtual? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<pre><code>virtual void ausgabe() = 0;
</code></pre>
<p>Und das ist zum Reservieren da? Weil es nachher überladen wird, oder?</p>
<p>@text2121</p>
<p>text2121 schrieb:</p>
<blockquote>
<p>es wurde nun bestimmt schon 10 mal in 10 threads gesagt: rule of three<br />
ohne bringt dein instance-counter nicht viel...</p>
</blockquote>
<p>auf wen beziehst du dich? Hier ist doch die Dreierregel überall vorhanden?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24273">@Wutz</a>:</p>
<p>Wutz schrieb:</p>
<blockquote>
<p>Wo ist hier (d)eine Vererbung?</p>
</blockquote>
<p>Den Kommentar verstehe ich jetzt nicht?!<br />
Mir wurde da angeraten, keine Vererbung zu benutzen. Also hab ich das auseinander genommen und einmal ohne gepostet.<br />
Und Camper hat eine Vererbungsoption gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358647</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 07 Oct 2013 16:45:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 16:51:35 GMT]]></title><description><![CDATA[<blockquote>
<p>warum ist der Destruktor virtual?</p>
</blockquote>
<p>Weil sonst nicht der Destruktor der abgeleiteten Klasse, sondern nur der der Basisklasse aufgerufen werden würde, wenn ich einen Basisklassenzeiger an delete übergebe. Ist ohne Beispiel schwer zu erklären.</p>
<pre><code>struct Base
{
    ~Base(){ std::cout &lt;&lt; &quot;Falsch!&quot;; }
};

struct Derived : Base
{
    ~Derived(){ std::cout &lt;&lt; &quot;Nicht &quot;; }
};

Base* b = new Derived;
delete b;
</code></pre>
<p>(Ungetestet)</p>
<blockquote>
<p>Und das ist zum Reservieren da? Weil es nachher überladen wird, oder?</p>
</blockquote>
<p>So ist es. Diese Funktion ist <em>pure virtual</em> und macht die Klasse abstrakt, die sie deklariert.</p>
<blockquote>
<p>Jetzt braucht es doch einen?</p>
</blockquote>
<p>Offensichtlich.</p>
<p>P.S.: Ich bins.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358651</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 07 Oct 2013 16:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Konstruktoren on Mon, 07 Oct 2013 17:02:54 GMT]]></title><description><![CDATA[<ul>
<li>schrieb:</li>
</ul>
<blockquote>
<p>Weil sonst nicht der Destruktor der abgeleiteten Klasse, sondern nur der der Basisklasse aufgerufen werden würde, wenn ich einen Basisklassenzeiger an delete übergebe.</p>
</blockquote>
<p>Dann hat mich ja mein Gefühl nicht getrübt, ich hab doch anfangs das hier geschrieben &quot;Aber hier rufe ich ja auch den Konstruktor einer anderen Klasse auf, mein Gefühl sagt mir, dass ich da noch was tun muss ... ? &quot; <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="🙂"
    /><br />
Hab mir schon gedacht, dass ich den der Oberklasse auch irgendwie aufrufen muss.</p>
<blockquote>
<p>Offensichtlich.</p>
</blockquote>
<p>aha!<br />
trivial!</p>
<p><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>(Ironie <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>
<ul>
<li>schrieb:</li>
</ul>
<blockquote>
<p>P.S.: Ich bins.</p>
</blockquote>
<p>Ja! <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="😃"
    /> lol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358656</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 07 Oct 2013 17:02:54 GMT</pubDate></item></channel></rss>