<?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[Problem mit Vererbung]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe einige Klassen, die ich nicht verändern kann. Ich möchte diese Klassen um eine Funktion (z.B. Output) erweitern. Ich möchte dann diese Funktion in einer Schleife für alle Objekte dieser Klassen aufrufen.<br />
Hier ein Beispiel:</p>
<pre><code class="language-cpp">class A
{
protected:
  int a;
};

class B
{
protected:
  int b;
};

class MyA : public A
{
public:
  Output() { cout &lt;&lt; a; }
};

class MyB : public B
{
public:
  Output() { cout &lt;&lt; b; }
};

TYPE Vector[2];          // &lt;- von welchem Typ muss Vector sein?
Vector[0] = new MyA;     
Vector[1] = new MyB;

for (int Idx = 0; Idx &lt; 2; Idx++)
{
  Vector[Idx]-&gt;Output();
}
</code></pre>
<p>Wie gesagt, an A und B kann ich nichts ändern!<br />
Kennt jemand eine Möglichkeit, wie dieses Beispiel funktionieren könnte? Mehrfachvererbung vielleicht?</p>
<p>Grüße aus Berlin!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/138201/problem-mit-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 01:42:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/138201.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Feb 2006 10:12:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 10:12:14 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe einige Klassen, die ich nicht verändern kann. Ich möchte diese Klassen um eine Funktion (z.B. Output) erweitern. Ich möchte dann diese Funktion in einer Schleife für alle Objekte dieser Klassen aufrufen.<br />
Hier ein Beispiel:</p>
<pre><code class="language-cpp">class A
{
protected:
  int a;
};

class B
{
protected:
  int b;
};

class MyA : public A
{
public:
  Output() { cout &lt;&lt; a; }
};

class MyB : public B
{
public:
  Output() { cout &lt;&lt; b; }
};

TYPE Vector[2];          // &lt;- von welchem Typ muss Vector sein?
Vector[0] = new MyA;     
Vector[1] = new MyB;

for (int Idx = 0; Idx &lt; 2; Idx++)
{
  Vector[Idx]-&gt;Output();
}
</code></pre>
<p>Wie gesagt, an A und B kann ich nichts ändern!<br />
Kennt jemand eine Möglichkeit, wie dieses Beispiel funktionieren könnte? Mehrfachvererbung vielleicht?</p>
<p>Grüße aus Berlin!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001744</guid><dc:creator><![CDATA[DuBu]]></dc:creator><pubDate>Fri, 24 Feb 2006 10:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 10:42:43 GMT]]></title><description><![CDATA[<p>Ja, Mehrfachvererbung wäre die einzige Möglichkeit, die mir einfällt:</p>
<pre><code class="language-cpp">class IMyClass
{
public:
  virtual void Output()=0;
};

class MyA : public IMyClass, public A
{
public
  void Output() {cout&lt;&lt;a;}
}

//myB analog

...
std::vector&lt;IMyClass*&gt; vec
vec.push_back(new MyA);
vec.push_back(new MyB);
...
for(int i=0;i&lt;vec.size();++i)
  vec[i]-&gt;Output();
</code></pre>
<p>(eventuell könnte man statt einfachen Vektoren einen Smart-Vektor verwenden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001782</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Fri, 24 Feb 2006 10:42:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 11:07:26 GMT]]></title><description><![CDATA[<p>Nach dem Schnittstellen-Prinzip gehören auch alle freien Funktionen, die mit A's oder B's arbeiten zur Schnittstelle der Klasse, sofern sie zusammen mit dieser deklariert werden.</p>
<p>Einfachster Ansatz für dich wäre: Definiere eine Funktion <em>void Output( A&amp;);</em> und packe sie entweder in den Header von A / B sofern du das kannst - oder stell sonst anderwärtig sicher, dass diese Funktion überall dort inkludiert wird, wo auch A / B inkludiert wird.</p>
<p>Edit: Hm meine Lösung klappt wohl nicht ganz, ich habe die Protected-Variablen übersehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001783</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 24 Feb 2006 11:07:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 10:51:52 GMT]]></title><description><![CDATA[<p>Mehrfachvererbung ist wohl die Lösung. Hilfreich wäre hier noch ein Template als Ergänzung von CStoll:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class MyClassImpl : public IMyClass, public T
{
public
  void Output() {cout&lt;&lt;a;}
};
</code></pre>
<p>Dann würde sich die Deklaration von MyA und dem nicht gezeigen MyB erübrigen:</p>
<pre><code class="language-cpp">std::vector&lt;IMyClass*&gt; vec
vec.push_back(new MyClassImpl&lt;A&gt;);
vec.push_back(new MyClassImpl&lt;B&gt;);
for (std::vector&lt;IMyClass*&gt;::iterator it = vec.begin(); it != vec.end(); ++it)
  it-&gt;Output();
</code></pre>
<p>Dabei fällt mir ein, daß die Output-Methode wahrscheinlich als const gemeint ist. Oder aber als freie Funktion, wie 7H3 angedeutet hat.</p>
<p>Tommi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001786</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 24 Feb 2006 10:51:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 10:56:36 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Mehrfachvererbung ist wohl die Lösung. Hilfreich wäre hier noch ein Template als Ergänzung von CStoll:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class MyClassImpl : public IMyClass, public T
{
public
  void Output() {cout&lt;&lt;a;}
};
</code></pre>
<p>Dann würde sich die Deklaration von MyA und dem nicht gezeigen MyB erübrigen:</p>
</blockquote>
<p>Von dem oberen Beispiel ausgehend, wird das so leider nichts - B (und MyB) hat nämlich kein Element 'a'. Aber ansonsten hast du recht, das wäre die logische Erweiterung meines Vorschlags.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001792</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Fri, 24 Feb 2006 10:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 12:07:40 GMT]]></title><description><![CDATA[<p>Folgendes wäre mir noch eingefallen, hat nur ein dummes Problem...</p>
<pre><code class="language-cpp">template &lt;class T, class U, U (T::* member)&gt;
class MyClass : public T
{
   void Output()
   {
      std::cout &lt;&lt; (this-&gt;*member);
   }
}

....

   MyClass&lt;A, int, &amp;A::a&gt; test;
   test.Output();
</code></pre>
<p>... und zwar kommt man an &amp;A::a nicht ran, weil es protected ist. Im Kontext der abgeleiteten Klasse sollte das gehen, wie man das aber aufschreibt ist mir noch nicht eingefallen (falls das überhaupt gehen sollte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001858</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 24 Feb 2006 12:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 13:18:21 GMT]]></title><description><![CDATA[<p>So ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> aber auch! Eure Lösungen sahen so gut aus!<br />
Ich arbeite (leider!) mit Borlands C++Builder und der beschwert sich, daß VCL-Klassen nicht mehrere Basisklassen haben dürfen. Die Klassen A und B aus meinem Beispiel sind VCL-Klassen und damit auch MyA und MyB.<br />
Hat jemand dafür eine Lösung? Vielleicht gibt es ja eine Borland-like-Lösung.</p>
<p>Grüße aus Berlin!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1001958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001958</guid><dc:creator><![CDATA[DuBu]]></dc:creator><pubDate>Fri, 24 Feb 2006 13:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 13:27:30 GMT]]></title><description><![CDATA[<p>Ohne Anspruch auf Erfolg mal eine Idee - wir packen die My*-Klassen in eine Hilfsklassen:</p>
<pre><code class="language-cpp">class A
{
protected:
  int a;
};

class MyA
{
public:
  void Output() {cout&lt;&lt;a;}
};

//B und MyB analog

class wrap_base //damit wir eine gemeinsame Basis haben
{
};

template&lt;class T&gt; class wrapper : public wrap_base
{
  T m_data;
public:
  wrapper(const T&amp; data=T()) : m_data(data) {}
  void Output() {m_data.Output();}
}

...
vector&lt;wrap_base*&gt; vec;
vec.push_back(new wrapper&lt;MyA&gt;);
vec.push_back(new wrapper&lt;MyB&gt;);
...
for(int i=0;i&lt;vec.size();++i)
  vec[i]-&gt;Output();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1001970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001970</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Fri, 24 Feb 2006 13:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung on Fri, 24 Feb 2006 13:57:22 GMT]]></title><description><![CDATA[<p>Das wird nen Tick komplizierter, aber nicht unlösbar.</p>
<pre><code class="language-cpp">class OutputBase
{
public:
   void Output() const = 0;
   virtual ~OutputBase() {}
};

template &lt;class T&gt;
class OutputMeth
{
public:
   typedef void (T::* MemFun)() const;
   OutputMeth( T* t, MemFun m) : _t( t), _m( m) {}
   void Output() const
   {
      (t-&gt;*m)();
   }
private:
   T* _t;
   MemFun _m;
};

template &lt;class T&gt;
OutputBase* makeOutputBase( T* t, void (T::* m)() const)
{
   return new OutputMeth&lt;T&gt;(t, m);
}

struct Deleter
{
   template &lt;typename T&gt;
   void operator()( T*&amp; t)
   {
      delete t;
      t = 0;
   }
};

...

MyA a;
MyB b;

std::vector&lt;OutputBase*&gt; vec;
vec.push_back( makeOutputBase( &amp;a, &amp;MyA::Output));
vec.push_back( makeOutputBase( &amp;b, &amp;MyB::Output));

// später das delete der Zeiger net vergessen
std::for_each( vec.begin(), vec.end(), Deleter());
</code></pre>
<p>Jetzt muss nur MyXXX eine Methode <em>void Output() const</em> haben, die du durch einfache Vererbung anflanschen kannst.<br />
~Btw, ein tolles Konzept geschweige denn ein zweckgemäßer Einsatz von Vererbung ist das aber nicht.~</p>
<p>Edit: Sorry CStoll, dein Post hab ich trotz Klick auf Aktualisieren nicht gesehen. Liegt wohl an unserem Proxy <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/1001992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1001992</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 24 Feb 2006 13:57:22 GMT</pubDate></item></channel></rss>