<?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]]></title><description><![CDATA[<p>Hallo,</p>
<p>in Sachen Vererbung habe ich ein kleines Problem und würde mich über euere Hilfe freuen.Drei abstrakte Klassen sollen als Grundgerüst dienen.</p>
<pre><code class="language-cpp">// Namesgebung soll auf die Verwendung hinweisen
class Haupt; 
class Nebenfunk1;
class Nebenfunk2;

// Abstraktes Gerüst
class Haupt : public Nebenfunk1, public Nebenfunk2 {
// ....
}
</code></pre>
<p>Für alle drei Klassen gibt es mehrere Implementierungen. Zudem soll jede von Haupt abgeleitete Klasse frei bei der Wahl der Nebenfunk-Implementierungen sein.</p>
<p>Ist folgendes richtig umgesetzt oder muss ich einen anderen Weg einschlagen?</p>
<pre><code class="language-cpp">// Namesgebung soll auf die Verwendung hinweisen
class Haupt;
class NewHaupt;

class Nebenfunk1;
class A1;
class B1;

class Nebenfunk2;
class A2;
class B2;

// Abstraktes Gerüst
template&lt;class N1 = Nebenfunk1, class N2 = Nebenfunk2&gt; // template erforderlich, da N1 und N2 fix sind?
class Haupt : public N1, public N2 {
// ....
}

class A1 : public Nebenfunk1 {
//
}

class B1 : public Nebenfunk1 {
//
}

class A2 : public Nebenfunk2 {
//
}

class B2 : public Nebenfunk2 {
//
}

template&lt;class N1 = A1, class N2 = A2&gt;
class NewHaupt : public N1, public N2 {
//
}
</code></pre>
<p>Ist das so richtig, oder hab ich den ein oder anderen Denkfehler?</p>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250495/vererbung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 00:33:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250495.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Sep 2009 20:05:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung on Fri, 18 Sep 2009 20:05:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in Sachen Vererbung habe ich ein kleines Problem und würde mich über euere Hilfe freuen.Drei abstrakte Klassen sollen als Grundgerüst dienen.</p>
<pre><code class="language-cpp">// Namesgebung soll auf die Verwendung hinweisen
class Haupt; 
class Nebenfunk1;
class Nebenfunk2;

// Abstraktes Gerüst
class Haupt : public Nebenfunk1, public Nebenfunk2 {
// ....
}
</code></pre>
<p>Für alle drei Klassen gibt es mehrere Implementierungen. Zudem soll jede von Haupt abgeleitete Klasse frei bei der Wahl der Nebenfunk-Implementierungen sein.</p>
<p>Ist folgendes richtig umgesetzt oder muss ich einen anderen Weg einschlagen?</p>
<pre><code class="language-cpp">// Namesgebung soll auf die Verwendung hinweisen
class Haupt;
class NewHaupt;

class Nebenfunk1;
class A1;
class B1;

class Nebenfunk2;
class A2;
class B2;

// Abstraktes Gerüst
template&lt;class N1 = Nebenfunk1, class N2 = Nebenfunk2&gt; // template erforderlich, da N1 und N2 fix sind?
class Haupt : public N1, public N2 {
// ....
}

class A1 : public Nebenfunk1 {
//
}

class B1 : public Nebenfunk1 {
//
}

class A2 : public Nebenfunk2 {
//
}

class B2 : public Nebenfunk2 {
//
}

template&lt;class N1 = A1, class N2 = A2&gt;
class NewHaupt : public N1, public N2 {
//
}
</code></pre>
<p>Ist das so richtig, oder hab ich den ein oder anderen Denkfehler?</p>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781224</guid><dc:creator><![CDATA[ThomasEnzinger]]></dc:creator><pubDate>Fri, 18 Sep 2009 20:05:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Fri, 18 Sep 2009 20:19:48 GMT]]></title><description><![CDATA[<p>Ich sehe nicht warum Templates hier unbedingt notwendig sind, insbesondere wenn du eh schon template class Main hast, warum dann im selben Stil nochmal template class NewMain her muss.<br />
Ist denn NewMain was komplett anderes als Main?</p>
<p>Im übrigen hast du noch nen Fehler im Code:<br />
Für Vererbung muss die komplette Basisklasse bekannt sein, nicht nur der Name.</p>
<p>Vllt. beschreibst du erst mal was du erreichen willst, dann stellst du eine konkrete Frage, dann kann man dir auch wirklich helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781243</guid><dc:creator><![CDATA[sowades]]></dc:creator><pubDate>Fri, 18 Sep 2009 20:19:48 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Fri, 18 Sep 2009 21:20:57 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>wenn ich dich richtig verstehe, funzt folgendes</p>
<pre><code class="language-cpp">// Namesgebung soll auf die Verwendung hinweisen
class Haupt;
class NewHaupt;

class Nebenfunk1;
class A1;
class B1;

class Nebenfunk2;
class A2;
class B2;

class Nebenfunk1 {

public:
  void func1();
}

class Nebenfunk2 {

public:
  int func2();
}

// Abstraktes Gerüst
class Haupt : public Nebenfunk1, public Nebenfunk2 {

public:
  bool funcHaupt();
}

class A1 : public Nebenfunk1 {
// ...
}

class B1 : public Nebenfunk1 {
// ...
}

class A2 : public Nebenfunk2 {soll das Grundgerüst darstellen, dass 
// ...
}

class B2 : public Nebenfunk2 {
// ...
}

template&lt;class N1 = A1, class N2 = A2&gt;
class NewHaupt : public N1, public N2 {
// ...
}
</code></pre>
<blockquote>
<p>Vllt. beschreibst du erst mal was du erreichen willst, dann stellst du eine konkrete Frage, dann kann man dir auch wirklich helfen.</p>
</blockquote>
<p>Ich möchte eine abstrakte Klasse nicht überladen und diese in Ihre logischen Bestandteile zerlegen und mittels Vererbung zusammen zu führen. Dies soll zu einer höheren Flexibilität führen.</p>
<p>Die Klasse Haupt dient als Grundgerüst. Mit einer Variablen &quot;Haupt h&quot; soll der Zugriff auf jede Standard-Aktion möglich sein.<br />
Nebenfunk 1 und 2 sind abstrakt, daher müssen diese in der NewHaupt spezifiziert werden. Dies soll nicht direkt in der NewHaupt geschehen, sondern durch eine direkte Ableitung der Klassen und in NewHaupt zusammengeführt werden.</p>
<p>Was mich interessiert<br />
- Weiß der Compiler an dieser Stelle</p>
<pre><code class="language-cpp">template&lt;class N1 = A1, class N2 = A2&gt;
class NewHaupt : public N1, public N2 {
</code></pre>
<p>, dass N1 und N2 die abstrakten Mehtoden aus Haupt implementieren?</p>
<pre><code class="language-cpp">class Haupt : public Nebenfunk1, public Nebenfunk2
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1781275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781275</guid><dc:creator><![CDATA[ThomasEnzinger]]></dc:creator><pubDate>Fri, 18 Sep 2009 21:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Fri, 18 Sep 2009 21:38:03 GMT]]></title><description><![CDATA[<p>ThomasEnzinger schrieb:</p>
<blockquote>
<p>Servus,</p>
<p>wenn ich dich richtig verstehe, funzt folgendes</p>
<p>//code</p>
</blockquote>
<p>Hmm sollte ja.<br />
Bur dass du, wenn du die Klasse eh schon gleich definierst du dir das forward deklarieren schenken kannst.</p>
<blockquote>
<p>Ich möchte eine abstrakte Klasse nicht überladen und diese in Ihre logischen Bestandteile zerlegen und mittels Vererbung zusammen zu führen. Dies soll zu einer höheren Flexibilität führen.</p>
</blockquote>
<p>Dies führt sicher nicht zu höherer Flexibilität, sondern eher zu ziemlichem Chaos <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 />
Kann es sein dass du aus C kommst? Eine Klasse ist ein in sich geschlossenes Konstrukt, welches mit den Membern und Methoden ein konkretes &quot;Ding&quot; beschreibt.<br />
Um dir das zu erklären was du gerade versuchst ein kleines Beispiel:<br />
Eine Mensch ist ein konkretes Objekt. Menschen und Industrieroboter haben etwas gemeinsam: Sie können greifen und haben dazu einen Arm. Gut, dann definieren wir eine Klasse Arm mit einer Methode greifen.<br />
Was du jetzt machst ist folgendes:</p>
<pre><code class="language-cpp">class Arm {
  public:
    void greifen();
};

class Mensch : public Arm {
  ///
};
</code></pre>
<p>Siehst du das Problem?<br />
Vererbung ist ausdrückbar mit Ist-Ein. Ein Mensch ist aber definitiv KEIN Arm!<br />
Also nicht versuchen eine Klasse zu zerstückeln, und dann per public-Vererbung wieder zusammenzusetzen.</p>
<blockquote>
<p>Was mich interessiert<br />
- Weiß der Compiler an dieser Stelle</p>
<pre><code class="language-cpp">template&lt;class N1 = A1, class N2 = A2&gt;
class NewHaupt : public N1, public N2 {
</code></pre>
<p>, dass N1 und N2 die abstrakten Mehtoden aus Haupt implementieren?</p>
<pre><code class="language-cpp">class Haupt : public Nebenfunk1, public Nebenfunk2
</code></pre>
</blockquote>
<p>Ähm, N1 und N2 implementieren nicht die abstrakten Methoden von Haupt!<br />
A1 und A2 haben rein gar nix mit Haupt zu tun, nur dass A1 von Nebenfunk1, A2 von Nebenfunk2 und Haupt von Nebenfunk1 und Nebenfunk2 erben. Es sind vollkommen verschiedene Typen!</p>
<p>Was ist denn der Hintergrund dass du dich zu so einem &quot;Gemetzel&quot; (=Zerstückeln von Klassen) genötigt siehst :D? Beschreib dein PROBLEM und nicht wie du es lösen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781282</guid><dc:creator><![CDATA[sowades]]></dc:creator><pubDate>Fri, 18 Sep 2009 21:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 19 Sep 2009 07:45:04 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ähmm, ja. Da stand ich gestern etwas auf dem Schlauch. Vier Weißbier sind nicht immer 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="😃"
    /></p>
<pre><code class="language-cpp">template&lt;class N1 = Nebenfunk1, class N2 = Nebenfunk2&gt;
class Haupt : public N1, public N2
</code></pre>
<p>Das wollte ich. Damit müsste ich folgendes machen können</p>
<pre><code class="language-cpp">class NewHaupt1 : public Haupt&lt;B1, A2&gt; {
// ....
}

class NewHaupt2: public Haupt&lt;A1&gt; {
// abstrakte Methoden von Haupt wird in NewHaupt2 implementiert
}

//...
</code></pre>
<p>Und das sollte auch gehen</p>
<pre><code class="language-cpp">Haupt* h = new NewHaupt2();
h-&gt;wasweißich();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1781345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781345</guid><dc:creator><![CDATA[ThomasEnzinger]]></dc:creator><pubDate>Sat, 19 Sep 2009 07:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 19 Sep 2009 10:12:16 GMT]]></title><description><![CDATA[<p><strong>Kannst du bitte dein PROBLEM in Worten beschreiben, und nicht Code posten, was du codetechnisch erreichen willst!</strong></p>
<p>Denn warum du ein template brauchst versteh ich nicht ganz.<br />
Zur Info: Die Template-Parameter bestimmen den Type deiner Instanz. Wenn du vorhast, durch die Templates einfach einem Objekt Spezialisierungen von Nebenfunk1 unterzujubeln - das geht nicht!</p>
<pre><code class="language-cpp">class A
{};

class B : public A
{};

template&lt; typename N &gt;
class Haupt
{};

int main()
{
    Haupt&lt;A&gt; a;
    Haupt&lt;B&gt; b;
    a = b; // hier kracht es, denn ein B erbt zwar von A, ist aber für den Compiler was anderes!
}
</code></pre>
<p>Das einzige, wie du das Problem lösen könntest (mit templates), wenn du in Haupt für jeden erdenklichen Fall einen operator=/copyCTor anbietest, in diesem Fall hieße der so:</p>
<pre><code class="language-cpp">Haupt&lt;N&gt;&amp; operator=(const Haupt&lt;B&gt;&amp; other);
</code></pre>
<p>Einzige Option, wenn du das erreichen willst: Runtime-Polymorphie + Aggregation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781369</guid><dc:creator><![CDATA[sowades]]></dc:creator><pubDate>Sat, 19 Sep 2009 10:12:16 GMT</pubDate></item></channel></rss>