<?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[Ableitungen virtual]]></title><description><![CDATA[<p>Hi,</p>
<p>hab eine Frage zu den Ableitungen...</p>
<pre><code class="language-cpp">class Basis
{
public:
   virtual GetData() = 0;

};

class MyClass : public Basis
{
public:
  virtual GetData()
  {

  }

protected:
  virtual int SetParams()=0;

};

class MySecondClass : public MyClass
{
 public:
   //hat keine virtuelle GetData() Methode

public:  
   virtual int SetParams()
   {
   }
};
</code></pre>
<p>Wie muss ich die SetParams Methode richtig initialisieren, so dass ich keine nicht aufgelösten Symbole als Fehlermeldung bekomme?</p>
<p>void MyClass::Init()<br />
{<br />
MySecondClass pat;</p>
<p>pat.SetParams();</p>
<p>}</p>
<p>Oder macht es mehr Sinn auf den virtuellen Kram zu verzichten? Insgesamt hab ich drei verschiedene Klassen die ich von der MyClass ableiten möchte. All diese Klassen besitzen eine unterschiedliche SetParam Methode.</p>
<p>Für Tipps würd ich mich freuen</p>
<p>Gruß<br />
Bernd</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275572/ableitungen-virtual</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 17:58:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275572.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Oct 2010 12:34:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ableitungen virtual on Sun, 17 Oct 2010 12:34:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>hab eine Frage zu den Ableitungen...</p>
<pre><code class="language-cpp">class Basis
{
public:
   virtual GetData() = 0;

};

class MyClass : public Basis
{
public:
  virtual GetData()
  {

  }

protected:
  virtual int SetParams()=0;

};

class MySecondClass : public MyClass
{
 public:
   //hat keine virtuelle GetData() Methode

public:  
   virtual int SetParams()
   {
   }
};
</code></pre>
<p>Wie muss ich die SetParams Methode richtig initialisieren, so dass ich keine nicht aufgelösten Symbole als Fehlermeldung bekomme?</p>
<p>void MyClass::Init()<br />
{<br />
MySecondClass pat;</p>
<p>pat.SetParams();</p>
<p>}</p>
<p>Oder macht es mehr Sinn auf den virtuellen Kram zu verzichten? Insgesamt hab ich drei verschiedene Klassen die ich von der MyClass ableiten möchte. All diese Klassen besitzen eine unterschiedliche SetParam Methode.</p>
<p>Für Tipps würd ich mich freuen</p>
<p>Gruß<br />
Bernd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966680</guid><dc:creator><![CDATA[derBernd]]></dc:creator><pubDate>Sun, 17 Oct 2010 12:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Sun, 17 Oct 2010 13:01:00 GMT]]></title><description><![CDATA[<p>mal abgesehen davon, dass getdata kein returntyp hat, sollte das so gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966690</guid><dc:creator><![CDATA[&amp;amp;?was]]></dc:creator><pubDate>Sun, 17 Oct 2010 13:01:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Sun, 17 Oct 2010 13:15:53 GMT]]></title><description><![CDATA[<p>Mich würde wundern, wenn du den Compiler davon überzeugen könntest, diesen Code zu übersetzen.<br />
Bspw. bei virtual GetData() dürfte es den ersten Fehler geben (in C++ gibt es keinen default int), außerdem gibt keine Funktion irgendetwas zurück. Wenn eine Fkt. als int f() deklariert ist, dann muss auch ein return sonstwas in ihr stehen.<br />
Ob es Sinn macht oder nicht, kommt immer darauf an, was du vorhast. Trifft auf die Basis aller abgeleiteten Klassen die <a href="http://de.wikipedia.org/wiki/Vererbung_%28Programmierung%29#Anwendungen_der_Vererbung" rel="nofollow">&quot;ist-ein&quot;-Beziehung</a> zu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966695</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Sun, 17 Oct 2010 13:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Sun, 17 Oct 2010 13:51:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">protected:
  virtual int SetParams()=0;

public:  
   virtual int SetParams()
   {
   }
</code></pre>
<p>Man kann die Sichtbarkeit erweitern <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/1966708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966708</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Oct 2010 13:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 14:47:03 GMT]]></title><description><![CDATA[<p>ja kann man du solltest(kannst?) sie nur nicht einschränken. da sonst die is-a-beziehung kaputt ist. siehe auch LSP <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" rel="nofollow">http://en.wikipedia.org/wiki/Liskov_substitution_principle</a></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28307">@derBernd</a> Polymorphie ist hierfür das Stichwort.<br />
und eine abstracte methode nicht als virtual zu deklarieren solltest du vermeiden..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967153</guid><dc:creator><![CDATA[ConfusedGuy]]></dc:creator><pubDate>Mon, 18 Oct 2010 14:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 15:39:46 GMT]]></title><description><![CDATA[<p>ConfusedGuy schrieb:</p>
<blockquote>
<p>ja kann man du solltest(kannst?) sie nur nicht einschränken. da sonst die is-a-beziehung kaputt ist.</p>
</blockquote>
<p>Nö, funktioniert wunderbar:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct A
{
  virtual std::string f() { return &quot;A&quot;; }
};

struct B : public A
{
private:
  virtual std::string f() { return &quot;B&quot;; }
};

void print( A&amp; aA )
{
        std::cerr &lt;&lt; aA.f() &lt;&lt; std::endl;
}

int main()
{
 A aA;
 B aB;

 print( aA );
 print( aB );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1967173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967173</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 18 Oct 2010 15:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 17:08:09 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<pre><code class="language-cpp">protected:
  virtual int SetParams()=0;

public:  
   virtual int SetParams()
   {
   }
</code></pre>
<p>Man kann die Sichtbarkeit erweitern <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>Das glaube ich nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967205</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 18 Oct 2010 17:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 17:10:54 GMT]]></title><description><![CDATA[<p>ConfusedGuy schrieb:</p>
<blockquote>
<p>ja kann man du solltest(kannst?) sie nur nicht einschränken. da sonst die is-a-beziehung kaputt ist.</p>
</blockquote>
<p>Ach, man kann doch sogar die ganze Klasse gleich private/protected ableiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967206</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 18 Oct 2010 17:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 17:25:16 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Nö, funktioniert wunderbar:</p>
</blockquote>
<p>Nur weil es technisch funktioniert, heisst es nicht dass das liskov prinzip nicht doch verletzt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967215</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 18 Oct 2010 17:25:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 17:30:28 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct A
{
private:
    virtual std::string f() { return &quot;A&quot;; }
};

struct B : public A
{
  virtual std::string f() { return &quot;B&quot;; }
};

void print( A&amp; aA )
{
        std::cout &lt;&lt; aA.f() &lt;&lt; std::endl;
}

int main()
{
    A aA;
    B aB;

    print( aA );
    print( aB );
    return 0;
}
</code></pre>
<p>So gehts aber nicht @manni66</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967216</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 18 Oct 2010 17:30:28 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 20:23:15 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Nö, funktioniert wunderbar:</p>
</blockquote>
<p>Nur weil es technisch funktioniert, heisst es nicht dass das liskov prinzip nicht doch verletzt wurde.</p>
</blockquote>
<p>Das stimmt, das Prinzip wurde aber nicht verletzt: ich kann den Subtyp B überall als A einsetzen und das Programm funktioniert korrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967312</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 18 Oct 2010 20:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 20:27:18 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct A
{
private:
    virtual std::string f() { return &quot;A&quot;; }
};

struct B : public A
{
  virtual std::string f() { return &quot;B&quot;; }
};

void print( A&amp; aA )
{
        std::cout &lt;&lt; aA.f() &lt;&lt; std::endl;
}

int main()
{
    A aA;
    B aB;

    print( aA );
    print( aB );
    return 0;
}
</code></pre>
<p>So gehts aber nicht @manni66</p>
</blockquote>
<ol>
<li>das habe ich auch nicht behauptet</li>
<li>auch hier wird die is-a-Beziehung aufrecht erhalten: was für A nicht geht funktioniert weiterhin für B nicht</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1967314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967314</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 18 Oct 2010 20:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 20:43:03 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>ConfusedGuy schrieb:</p>
<blockquote>
<p>ja kann man du solltest(kannst?) sie nur nicht einschränken. da sonst die is-a-beziehung kaputt ist.</p>
</blockquote>
<p>Ach, man kann doch sogar die ganze Klasse gleich private/protected ableiten.</p>
</blockquote>
<p>Kann man durchaus, allerdings bedeutet private Vererbung keine is-a-Beziehung, sondern die Übernahme von Implementationsdetails und ist hauptsächlich im Zusammenhang mit empty-base-optimization von Interesse.</p>
<p>Es ist wichtig, zu bemerken, dass is-a im objektorientierten Sinne nicht das gleiche bedeutet wie im allgemeinen Sprachgebrauch. &quot;A is-a B&quot; bedeutet, dass A alles kann, was B auch kann und man eine Instanz von A dementsprechend auch als Instanz von B benutzen kann. Insbesondere bedeutet das, dass zusätzliche Einschränkungen in abgeleiteten Klassen im objektorientierten Sinne nicht passieren - beispielsweise ist ein Rechteck hier ein Quadrat, aber ein Quadrat nicht notwendigerweise ein Rechteck, und ein tief religiöser Mensch ist objektorientiert ein Atheist, der zusätzlich halt an Götter glaubt.</p>
<p>Erbe ich eine Klasse privat, so ist diese Beziehung nicht vorhanden.</p>
<pre><code class="language-cpp">struct A {};
struct B : private A {};

int main() {
  B b;
  A &amp;r = b; // KAWUMM!
}
</code></pre>
<p>funktioniert nicht, dementsprechend gibt es zwischen B und A keine is-a-Beziehung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967323</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 18 Oct 2010 20:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 21:31:27 GMT]]></title><description><![CDATA[<p>Okay ...<br />
wenn ich aber einzelne Einschränkungen treffe, dann funktioniert es:</p>
<pre><code class="language-cpp">class basis
{
	public:
		void foo(){int a = 0;}
};

class erbt : public basis
{
	private:
		void foo();
};

int main()
{
	erbt objekt;

	basis&amp; objektRef = objekt;

	objektRef.foo();  //geht

	//objekt.foo();   Dies geht nicht!
}
</code></pre>
<p>Ansonsten entnehme ich Deinen Ausführungen, daß Vererbung nicht grundsätzlich eine &quot;ist ein(e)&quot; - Beziehung ausdrückt, sondern nur, wenn man in der abgeleiteten Klasse keinerlei Einschränkungen bzgl. der geerbten Attribute vornimmt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967343</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 18 Oct 2010 21:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Mon, 18 Oct 2010 22:31:16 GMT]]></title><description><![CDATA[<p>Nö, wieso? Du schränkst ja nichts ein - ich kann ein Objekt vom Typ erbt nach wie vor als Objekt vom Typ basis benutzen. Dass du halbärschig versuchst, Methoden zu verstecken, hat darauf keine Auswirkung - du machst lediglich die Notation etwas merkwürdig.</p>
<p>Ich habe den Eindruck, du zäumst das Pferd von hinten auf. Häng dich nicht an Sprachmitteln auf - nicht die Sprache ist objektorientiert, sondern dein Programmmodell. Du entwickelst ein objektorientiertes Modell, dann implementierst du es mit den Mitteln deiner Sprache - und üblicherweise ist der beste Weg, in C++ eine is-a-Beziehung auszudrücken, die öffentliche Vererbung.</p>
<p>Wenn du stattdessen auf das in C übliche Pointer-Punning zurückgreifst, wird dein Programm unhandlicher, aber nicht weniger objektorientiert, und es ist durchaus möglich, Typen, die in keiner Weise eine is-a-Beziehung haben, durch öffentliche Vererbung miteinander zu verbinden; dein Code wird dadurch unangenehm zu benutzen, aber machbar ist es durchaus. Man könnte beispielsweise</p>
<pre><code class="language-cpp">struct cow {
  virtual void eat(double kilograms);
  virtual void moo() const;
};

struct dog : cow {
  virtual void bark() const;
private:
  virtual void moo() const; // &gt;.&lt;
}
</code></pre>
<p>schreiben und in der Dokumentation erwähnen, dass dog nicht als cow benutzt werden sollte, aber es wäre fehleranfälliger als ein vernünftiges, objektorientiertes Modell (und jeder andere Programmierer, der deinen Code in die Finger bekäme, schlüge die Hände über dem Kopf zusammen).</p>
<p>Per Konvention erwartet man, dass durch öffentliche Vererbung verbundene Typen eine is-a-Beziehung haben, während private Vererbung die Übernahme von Implementationsdetails bedeutet. Du musst dich an diese Konvention nicht halten, aber es ist in aller Regel eine gute Idee, es zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967359</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 18 Oct 2010 22:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Tue, 19 Oct 2010 11:39:04 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Das stimmt, das Prinzip wurde aber nicht verletzt: ich kann den Subtyp B überall als A einsetzen und das Programm funktioniert korrekt.</p>
</blockquote>
<p>Es mag technisch funktionieren, aber du verletzt idR damit invarianten da es einen Grund gibt warum die Funktion nicht public ist.</p>
<p>Wenn wir von schlechtem Design ausgehen und es keinen Grund gibt warum die Funktion protected ist - dann mag es uU OK sein sie public zu setzen.</p>
<p>Wobei ich gerne soweit gehe und Liskov hier rauslasse und sage: sowas tut man einfach nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967477</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 19 Oct 2010 11:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Tue, 19 Oct 2010 11:56:36 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Es ist wichtig, zu bemerken, dass is-a im objektorientierten Sinne nicht das gleiche bedeutet wie im allgemeinen Sprachgebrauch.</p>
</blockquote>
<p>Das sehe ich Anders. Öffentliche Vererbung sollte nur dann eingesetzt werden wenn man auch im normalen Sprachgebrauch sagen kann: &lt;Kindelement&gt; ist ein &lt;Parentelement&gt; (z.B. Angestellter ist eine Person), und zudem das Kindelement auch ohne Einschränkungen als Parentelement eingesetzt werden kann (z.B. mag ein Quadrat zwar ein Rechteck sein, aber nur über Einschränkungen des Verhaltens).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967488</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 19 Oct 2010 11:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Tue, 19 Oct 2010 12:05:25 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Das stimmt, das Prinzip wurde aber nicht verletzt: ich kann den Subtyp B überall als A einsetzen und das Programm funktioniert korrekt.</p>
</blockquote>
<p>Es mag technisch funktionieren, aber du verletzt idR damit invarianten da es einen Grund gibt warum die Funktion nicht public ist.</p>
<p>Wenn wir von schlechtem Design ausgehen und es keinen Grund gibt warum die Funktion protected ist - dann mag es uU OK sein sie public zu setzen.</p>
<p>Wobei ich gerne soweit gehe und Liskov hier rauslasse und sage: sowas tut man einfach nicht.</p>
</blockquote>
<p>&quot;Weil man das nicht tut&quot; hat mir schon als Kind nicht als Begründung für etwas ausgereicht <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>Wenn die Regel lautet &quot;das sollte man gut begründen&quot; kann ich dem zustimmen, aber &quot;sowas tut man nicht&quot; sagt man nicht <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/1967491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967491</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 19 Oct 2010 12:05:25 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Tue, 19 Oct 2010 13:40:43 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Das sehe ich Anders. Öffentliche Vererbung sollte nur dann eingesetzt werden wenn man auch im normalen Sprachgebrauch sagen kann: &lt;Kindelement&gt; ist ein &lt;Parentelement&gt; (z.B. Angestellter ist eine Person), und zudem das Kindelement auch ohne Einschränkungen als Parentelement eingesetzt werden kann (z.B. mag ein Quadrat zwar ein Rechteck sein, aber nur über Einschränkungen des Verhaltens).</p>
</blockquote>
<p>Naja, wenn wir erstmal von Lehrbuchbeispielen wegkommen, ist der allgemeine Sprachgebrauch sowieso nicht mehr anwendbar. &quot;Ein basic_ios ist ein ios_base&quot; hat außerhalb der Programmierung keine Bedeutung.</p>
<p>Der Punkt ist, dass im allgemeinen Sprachgebrauch &quot;ist ein&quot; im relevanten Sinne eine Ähnlichkeit mit kleinen Modifikationen am Konzept bedeutet, die nicht alle in den objektorientierten Gebrauch passen - dort ist entscheidend, dass eine abgeleitete Klasse die Funktionalität der Basisklasse erweitert. Das deckt sich gelegentlich mit dem allgemeinen Sprachgebrauch, kann aber auch gegenläufig sein. Es kann sich sogar gleichzeitig decken <em>und</em> gegenläufig sein, denn der allgemeine Sprachgebrauch ist oft keinesfalls eindeutig.</p>
<p>Und noch aus einem anderen Grund ist der allgemeine Sprachgebrauch eine schlechte Metrik für die Qualität eines objektorientierten Modells: wenn du eine Klasse &quot;Angestellter&quot; programmierst, die von &quot;Person&quot; erbt, implementierst du weder eine komplette Person noch einen kompletten Angestellten, sondern nur die Aspekte der beiden, die du für dein Modell brauchst. Je nachdem, welche Aspekte das sind, erhält man völlig andere Verwandschaftsstrukturen.</p>
<p>Beispiel: Ich modelliere das Tierreich. Taxonomisch betrachtet könnte ich etwa so vorgehen:</p>
<pre><code class="language-cpp">class animal   { };

class dinosaur : public animal { };
class mammal   : public animal { };

class bird     : public dinosaur { };
class bat      : public mammal   { };
class monkey   : public mammal   { };
class human    : public monkey   { };
</code></pre>
<p>interessiert mich aber nicht die Taxonomie, sondern beispielsweise die Fortbewegungsfähigkeit, komme ich eher auf etwas in dieser Art:</p>
<pre><code class="language-cpp">class animal { };

class   flying_animal : public animal { };
class climbing_animal : public animal { };
class  walking_animal : public animal { };

class bird   : public   flying_animal { };
class bat    : public   flying_animal { };
class monkey : public climbing_animal { };
class human  : public  walking_animal { };
</code></pre>
<p>Der allgemeine Sprachgebrauch bringt mich da nicht weiter. Zumal, möchte ich anmerken, es trotz biologischer Tatsachen im allgemeinen Sprachgebrauch nach wie vor unüblich ist, Menschen als Affen oder gar Tiere zu bezeichnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967541</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 19 Oct 2010 13:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Ableitungen virtual on Wed, 20 Oct 2010 06:13:04 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Der Punkt ist, dass im allgemeinen Sprachgebrauch &quot;ist ein&quot; im relevanten Sinne eine Ähnlichkeit mit kleinen Modifikationen am Konzept bedeutet, die nicht alle in den objektorientierten Gebrauch passen</p>
</blockquote>
<p>Ganz davon abgesehen das Ableitungen grundsätzlich mit Vorsicht zu genießen sind, und deutlich zu häufig Verwendung finden.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>interessiert mich aber nicht die Taxonomie, sondern beispielsweise die Fortbewegungsfähigkeit, komme ich eher auf etwas in dieser Art:</p>
</blockquote>
<p>Und ich komme spätestens hier an einen Punkt, wo man Komposition der Ableitung vorziehen sollte (was ohnehin häufig der bessere Weg ist, um starke Kopplungen zu vermeiden) - es sei den es geht um rein virtuelle Schnittstellen (in anderen Sprachen Inferface genannt).</p>
<p>Eine Ausnahme sehe ich auch hier, in speziellen Gebrauch mit C++: &quot;Konfigurierbare&quot; Klassen (Policy based Design...).</p>
<p>Allgemein gesprochen gibt es meines Erachtens kaum eine schlechtere Wahl für ein Klassendesign als tiefe Vererbungshierarchien, auch und insbesondere in den von dir gezeigten Antibeispiel (Wie bildest du hier sinnvoll fliegende Wesen, die gleichzeitig gut schwimmen können etc. nach). Komposition ist sehr häufig eine bessere Alternative.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967818</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 20 Oct 2010 06:13:04 GMT</pubDate></item></channel></rss>