<?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[abstrakte klassen, abst.funktionen, virtuelle methoden]]></title><description><![CDATA[<p>Hallo,<br />
habe folgende Klassen...</p>
<pre><code class="language-cpp">//Polymorphie , abstrakte Datentypen (Klassen)

#include &lt;iostream&gt;
#include &lt;conio.h&gt;

using namespace std;

enum COLOR {Red, Green, Blue, Yellow, White, Black, Brown};

class Animal
{
 private:
         int itsAge;
 public:
        Animal(int);
        virtual ~Animal(){cout&lt;&lt; &quot;Animal-Destruktor...&quot; &lt;&lt;endl;}

        virtual int GetAge() const {return itsAge;}
        virtual void SetAge(int age) {itsAge = age;}
        virtual void Sleep() const = 0;
        virtual void Eat() const = 0;
        virtual void Reproduce() const = 0;
        virtual void Move() const = 0;
        virtual void Speak() const = 0;
};
Animal::Animal(int age)
{
 cout&lt;&lt; &quot;Animal-Konstruktor...&quot; &lt;&lt;endl;                   
}
//------------------------------------------------------------------------------

class Mammal : public Animal
{
 public:
      Mammal(int age):Animal(age) {cout&lt;&lt; &quot;Mammal-Konstruktor...&quot; &lt;&lt;endl;}
      virtual ~Mammal () {cout&lt;&lt; &quot;Mammal-Destruktor...&quot; &lt;&lt;endl;}      

      virtual void Reproduce() const {cout&lt;&lt; &quot;Mammal-Fortpflanzung...&quot; &lt;&lt;endl;}
};
//------------------------------------------------------------------------------

class Fish : public Animal
{
 public: 
        Fish(int age):Animal(age) {cout&lt;&lt; &quot;Fish-Konstruktor...&quot; &lt;&lt;endl;}      
        virtual ~Fish() {cout&lt;&lt; &quot;Fish-Destruktor...&quot; &lt;&lt;endl;}

        virtual void Sleep() const {cout&lt;&lt; &quot;Fisch-schlummert...&quot; &lt;&lt;endl;}
        virtual void Eat() const {cout&lt;&lt; &quot;Fisch-fuettern...&quot; &lt;&lt;endl;}
        virtual void Reproduce() const {cout&lt;&lt; &quot;Fisch-legt Eier...&quot; &lt;&lt;endl;}
        virtual void Move() const {cout&lt;&lt; &quot;Fisch-schwimmt...&quot; &lt;&lt;endl;}
        virtual void Speak() const {}
};
//------------------------------------------------------------------------------

class Horse : public Mammal
{
 protected:
           COLOR itsColor;
 public:
        Horse(int age, COLOR color):Mammal(age), itsColor(color){cout&lt;&lt; &quot;Horse-Konstruktor...&quot; &lt;&lt;endl;}
        virtual ~Horse() {cout&lt;&lt; &quot;Horse-Destruktor...&quot; &lt;&lt;endl;}

        virtual void Speak() const {cout&lt;&lt; &quot;Wieher!...&quot; &lt;&lt;endl;}
        virtual COLOR GetItsColor() const {return itsColor;}
        virtual void Sleep() const {cout&lt;&lt; &quot;Pferd schläft...&quot; &lt;&lt;endl;}
        virtual void Eat() const {cout&lt;&lt; &quot;Pferd fuettern...&quot; &lt;&lt;endl;}
        virtual void Move() const {cout&lt;&lt; &quot;Pferd laeuft...&quot; &lt;&lt;endl;}
};
//------------------------------------------------------------------------------

class Dog : public Mammal
{
 protected:
           COLOR itsColor;
 public:
        Dog(int age, COLOR color):Mammal(age), itsColor(color){cout&lt;&lt; &quot;Dog-Konstruktor...&quot; &lt;&lt;endl;}
        virtual ~Dog(){cout&lt;&lt; &quot;Dog-Destruktor...&quot; &lt;&lt;endl;}

        virtual void Sleep() const {cout&lt;&lt; &quot;Hund-schlummert...&quot; &lt;&lt;endl;}
        virtual void Eat() const {cout&lt;&lt; &quot;Hund-frisst...&quot; &lt;&lt;endl;}
        virtual void Move() const {cout&lt;&lt; &quot;Hund-laeuft...&quot; &lt;&lt;endl;}
        virtual void Speak() const {cout&lt;&lt; &quot;Wuff!...&quot; &lt;&lt;endl;}
};
//------------------------------------------------------------------------------

int main()
{
    Animal *pAnimal = 0;
    int choice;
    bool fQuit = false;

    while(1)
    {
     cout&lt;&lt; &quot;(1)Hund (2)Pferd (3)Fisch (0)Beenden: &quot;;
     cin&gt;&gt; choice;
     switch(choice)
     {
      case 1: pAnimal = new Dog(3, Black);
              break;
      case 2: pAnimal = new Horse(10, Brown);
              break;
      case 3: pAnimal = new Fish(122);
              break;
      default: fQuit = true;
               break;
     }
     if(fQuit)
       break;

     pAnimal -&gt; Speak();
     pAnimal -&gt; Eat();
     pAnimal -&gt; Reproduce();
     pAnimal -&gt; Move();
     pAnimal -&gt; Sleep();

     delete pAnimal;            

    }//endwhile

    getch();
    return 0;    
}
</code></pre>
<p>Wie komme ich bitte schön an meine Age-Variable ran?<br />
Der Dog-Konstruktor ruft den Mammal-Konstruktor auf und der wiederum ruft den<br />
Animal-Konstruktor auf und der setzt dann itsAge auf den eingegebenen Wert.<br />
Wie komme ich denn an den Wert ran? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
itsAge ist ja privat.<br />
Was ich nicht verstehe ist: die methode GetAge() wird abgeleitet, weil sie nicht abstrakt ist, aber die Variable itsAge ist doch privat, also kann ich mittels abgeleiteter Klasse nicht auf itsAge zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171917/abstrakte-klassen-abst-funktionen-virtuelle-methoden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 04:24:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171917.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Jan 2007 15:46:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Tue, 30 Jan 2007 15:46:40 GMT]]></title><description><![CDATA[<p>Hallo,<br />
habe folgende Klassen...</p>
<pre><code class="language-cpp">//Polymorphie , abstrakte Datentypen (Klassen)

#include &lt;iostream&gt;
#include &lt;conio.h&gt;

using namespace std;

enum COLOR {Red, Green, Blue, Yellow, White, Black, Brown};

class Animal
{
 private:
         int itsAge;
 public:
        Animal(int);
        virtual ~Animal(){cout&lt;&lt; &quot;Animal-Destruktor...&quot; &lt;&lt;endl;}

        virtual int GetAge() const {return itsAge;}
        virtual void SetAge(int age) {itsAge = age;}
        virtual void Sleep() const = 0;
        virtual void Eat() const = 0;
        virtual void Reproduce() const = 0;
        virtual void Move() const = 0;
        virtual void Speak() const = 0;
};
Animal::Animal(int age)
{
 cout&lt;&lt; &quot;Animal-Konstruktor...&quot; &lt;&lt;endl;                   
}
//------------------------------------------------------------------------------

class Mammal : public Animal
{
 public:
      Mammal(int age):Animal(age) {cout&lt;&lt; &quot;Mammal-Konstruktor...&quot; &lt;&lt;endl;}
      virtual ~Mammal () {cout&lt;&lt; &quot;Mammal-Destruktor...&quot; &lt;&lt;endl;}      

      virtual void Reproduce() const {cout&lt;&lt; &quot;Mammal-Fortpflanzung...&quot; &lt;&lt;endl;}
};
//------------------------------------------------------------------------------

class Fish : public Animal
{
 public: 
        Fish(int age):Animal(age) {cout&lt;&lt; &quot;Fish-Konstruktor...&quot; &lt;&lt;endl;}      
        virtual ~Fish() {cout&lt;&lt; &quot;Fish-Destruktor...&quot; &lt;&lt;endl;}

        virtual void Sleep() const {cout&lt;&lt; &quot;Fisch-schlummert...&quot; &lt;&lt;endl;}
        virtual void Eat() const {cout&lt;&lt; &quot;Fisch-fuettern...&quot; &lt;&lt;endl;}
        virtual void Reproduce() const {cout&lt;&lt; &quot;Fisch-legt Eier...&quot; &lt;&lt;endl;}
        virtual void Move() const {cout&lt;&lt; &quot;Fisch-schwimmt...&quot; &lt;&lt;endl;}
        virtual void Speak() const {}
};
//------------------------------------------------------------------------------

class Horse : public Mammal
{
 protected:
           COLOR itsColor;
 public:
        Horse(int age, COLOR color):Mammal(age), itsColor(color){cout&lt;&lt; &quot;Horse-Konstruktor...&quot; &lt;&lt;endl;}
        virtual ~Horse() {cout&lt;&lt; &quot;Horse-Destruktor...&quot; &lt;&lt;endl;}

        virtual void Speak() const {cout&lt;&lt; &quot;Wieher!...&quot; &lt;&lt;endl;}
        virtual COLOR GetItsColor() const {return itsColor;}
        virtual void Sleep() const {cout&lt;&lt; &quot;Pferd schläft...&quot; &lt;&lt;endl;}
        virtual void Eat() const {cout&lt;&lt; &quot;Pferd fuettern...&quot; &lt;&lt;endl;}
        virtual void Move() const {cout&lt;&lt; &quot;Pferd laeuft...&quot; &lt;&lt;endl;}
};
//------------------------------------------------------------------------------

class Dog : public Mammal
{
 protected:
           COLOR itsColor;
 public:
        Dog(int age, COLOR color):Mammal(age), itsColor(color){cout&lt;&lt; &quot;Dog-Konstruktor...&quot; &lt;&lt;endl;}
        virtual ~Dog(){cout&lt;&lt; &quot;Dog-Destruktor...&quot; &lt;&lt;endl;}

        virtual void Sleep() const {cout&lt;&lt; &quot;Hund-schlummert...&quot; &lt;&lt;endl;}
        virtual void Eat() const {cout&lt;&lt; &quot;Hund-frisst...&quot; &lt;&lt;endl;}
        virtual void Move() const {cout&lt;&lt; &quot;Hund-laeuft...&quot; &lt;&lt;endl;}
        virtual void Speak() const {cout&lt;&lt; &quot;Wuff!...&quot; &lt;&lt;endl;}
};
//------------------------------------------------------------------------------

int main()
{
    Animal *pAnimal = 0;
    int choice;
    bool fQuit = false;

    while(1)
    {
     cout&lt;&lt; &quot;(1)Hund (2)Pferd (3)Fisch (0)Beenden: &quot;;
     cin&gt;&gt; choice;
     switch(choice)
     {
      case 1: pAnimal = new Dog(3, Black);
              break;
      case 2: pAnimal = new Horse(10, Brown);
              break;
      case 3: pAnimal = new Fish(122);
              break;
      default: fQuit = true;
               break;
     }
     if(fQuit)
       break;

     pAnimal -&gt; Speak();
     pAnimal -&gt; Eat();
     pAnimal -&gt; Reproduce();
     pAnimal -&gt; Move();
     pAnimal -&gt; Sleep();

     delete pAnimal;            

    }//endwhile

    getch();
    return 0;    
}
</code></pre>
<p>Wie komme ich bitte schön an meine Age-Variable ran?<br />
Der Dog-Konstruktor ruft den Mammal-Konstruktor auf und der wiederum ruft den<br />
Animal-Konstruktor auf und der setzt dann itsAge auf den eingegebenen Wert.<br />
Wie komme ich denn an den Wert ran? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
itsAge ist ja privat.<br />
Was ich nicht verstehe ist: die methode GetAge() wird abgeleitet, weil sie nicht abstrakt ist, aber die Variable itsAge ist doch privat, also kann ich mittels abgeleiteter Klasse nicht auf itsAge zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219944</guid><dc:creator><![CDATA[testor]]></dc:creator><pubDate>Tue, 30 Jan 2007 15:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Tue, 30 Jan 2007 16:01:25 GMT]]></title><description><![CDATA[<p>hmm, hoffe ich habv das richtig verstanden.<br />
in der basisklasse (Animal) hast du ja bereits die funktionen get/Set-Age.<br />
somit müsstes du die doch nicht überschreiben für die abgeleiteten klassen (funktion wird sich doch nicht ändern für die abgeleiteten klassen,oder?)</p>
<p>und wenn doch, sehe ich hier nur die möglichkeit mittels getAge / setAge die funktionalität zu überschreiben (also nicht direkt auf itsAge zugreifen =(natürlich funktionsaufrufe mehr) )</p>
<p>just my 2c</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219967</guid><dc:creator><![CDATA[TUser]]></dc:creator><pubDate>Tue, 30 Jan 2007 16:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Tue, 30 Jan 2007 16:10:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">protected:
    int itsAge;
</code></pre>
<p>Das löst dein Problem, protectet ist nach außen wie private nur mit dem unterschied das abgeleitete Klassen auf protectet zugreifen können es is also son zwischending zwischen private und public. Damit kannste auf deine variable zugreifen ohne dich in nem Funktionenwald zu verlaufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219969</guid><dc:creator><![CDATA[Raven2]]></dc:creator><pubDate>Tue, 30 Jan 2007 16:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Tue, 30 Jan 2007 16:40:30 GMT]]></title><description><![CDATA[<p>Raven2 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">protected:
    int itsAge;
</code></pre>
<p>Das löst dein Problem, protectet ist nach außen wie private nur mit dem unterschied das abgeleitete Klassen auf protectet zugreifen können es is also son zwischending zwischen private und public. Damit kannste auf deine variable zugreifen ohne dich in nem Funktionenwald zu verlaufen.</p>
</blockquote>
<p>mMn nicht schön, damit unterläufst du die Kapselung. Das mit den set/get Funktionen der Basis funktioniert doch auch für die Abgeleiteten, solange du sie nicht überschreibst. Die abgeleiteten Klassen rufen Animal::GetAge() auf, und alle sind zufrieden.. <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/1219994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219994</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 30 Jan 2007 16:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Tue, 30 Jan 2007 17:12:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>was für mich die Frage anschließt, warum die getter und Setter eigentlich virtual sind ...<br />
Wenn die Attribute (itsAge) private sind ... welchen Zweck hat dann das aböeiten ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220018</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 30 Jan 2007 17:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Tue, 30 Jan 2007 17:26:19 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>...welchen Zweck hat dann das aböeiten ?...</p>
</blockquote>
<p>Vorsicht gesuchtes Beispiel!<br />
Angenommen, man rechnet Hundejahre mal sieben und Rattenjahre mal 40, dann könnte es Sinn machen getAge abzuleiten</p>
<pre><code class="language-cpp">int Rat::GetAge() const
{
    return 40 * Animal::GetAge();
}
//...
int Dog::GetAge() const
{
    return 7 * Animal::GetAge();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1220040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220040</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 30 Jan 2007 17:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Wed, 31 Jan 2007 08:42:30 GMT]]></title><description><![CDATA[<p>THX 1138 schrieb:</p>
<blockquote>
<p>...<br />
Vorsicht gesuchtes Beispiel!<br />
...</p>
</blockquote>
<p>Oha <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="😮"
    /> <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="😮"
    /><br />
Ich würde mich seeeehr hüten vor einer Konstruktion, bei der</p>
<pre><code class="language-cpp">a.setX(a.getX());
</code></pre>
<p>zu einer Veränderung von a führt.<br />
Natürlich kann man setAge() ebenfalls überschreiben, aber insgesamt entspricht das nicht mehr der üblichen getter/setter-Semantik ....</p>
<p>Es gibt natürlich Konstellationen, in denen innere Attribute in veränderter Form (anderer Typ) nach außen gegeben werden bzw. von außen empfangen werden, aber</p>
<ul>
<li>ich würde dann eher nicht get/set() (als Funktionsnamen) nehmen und</li>
<li>ob es sinnvoll ist, die Konvertierung aber nicht die interne Repräsentation den Nachkommen in die Hand zu geben, würde ich auch lange überlegen.</li>
</ul>
<p>Aber: &quot;Falsch&quot; ist das natürlich nicht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220325</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 31 Jan 2007 08:42:30 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Wed, 31 Jan 2007 12:21:33 GMT]]></title><description><![CDATA[<p>MMn machen getter/setter genau dann Sinn, wenn der Wert noch umgewandelt wird. Ansonsten könnte man gleich eine public Variable nehmen.<br />
Und natürlich müsste der setter sich auch entsprechend verhalten, also den Wert durch 40 resp. 7 teilen.<br />
Aber wie gesagt, gesuchtes Beispiel und sowas ist mir auch noch nicht untergekommen. Ich vermeide aber auch protected Variablen wenn es geht, und verwende in abgeleiteten Klassen die getter/setter der Basis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220434</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Wed, 31 Jan 2007 12:21:33 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Fri, 09 Feb 2007 15:57:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">cout&lt;&lt;endl &lt;&lt; pAnimal -&gt; GetAge() &lt;&lt;endl;     
cout&lt;&lt; endl &lt;&lt;pAnimal -&gt; Animal::GetAge() &lt;&lt;endl;
</code></pre>
<p>ich bekomme immer den selben wert: 388907<br />
beim horse und beim dog...<br />
nur der fish hat 0 <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/1225771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225771</guid><dc:creator><![CDATA[testor]]></dc:creator><pubDate>Fri, 09 Feb 2007 15:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte klassen, abst.funktionen, virtuelle methoden on Sat, 10 Feb 2007 18:03:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Animal::Animal(int age)
{
 cout&lt;&lt; &quot;Animal-Konstruktor...&quot; &lt;&lt;endl;                  
}
</code></pre>
<p>itsage wird hier nichts zugewiesen <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/1226385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1226385</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Feb 2007 18:03:33 GMT</pubDate></item></channel></rss>