<?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[Anfängerfrage zur Vererbung]]></title><description><![CDATA[<p>Hei!</p>
<p>Ich lese zur Zeit ein Buch über C++ und bin gerade im Kapitel über Vererbung.<br />
Es wird gerade erklärt, wie man eine Elementfunktion der Basisklasse redefiniert.<br />
Dort heißt es:</p>
<blockquote>
<p>Es ist ein häufiger Fehler, dass man das Schlüsselwort const vergisst.<br />
Das Schlüsselwort const gehört zur Signatur. Lässt man es weg, ändert man die Signatur und verbirgt damit die Methode, statt sie - wie eigentlich beabsichtigt - zu redefinieren.</p>
</blockquote>
<p>Weil ich das ganze nicht vollständig verstanden habe, tippte ich den dazugehörigen Beispielcode mal ab und hab da ein wenig dran rumgespielt, hier der originale Code:</p>
<pre><code>#include &lt;iostream&gt;

class Mammal
{
	public:
		void Move() const
		{
			std::cout &lt;&lt; &quot;Mammal Move...&quot; &lt;&lt; std::endl; 
		}
		void Move(int distance) const
		{
			std::cout &lt;&lt; &quot;Mammal Move... &quot; &lt;&lt; distance &lt;&lt; &quot; Steps!&quot; &lt;&lt; std::endl;
		}
	protected:
		int m_age;
		int m_weight;
};

class Dog: public Mammal
{
	public: 
	void Move() const
	{
		std::cout &lt;&lt; &quot;Dog Move...&quot; &lt;&lt; std::endl;
	}
};

int main(void)
{
	Mammal bigAnimal;
	Dog fido;
	bigAnimal.Move();
	bigAnimal.Move(23);
	fido.Move();
	fido.Mammal::Move(2);
	getchar();
	return 0;
}
</code></pre>
<p>Weiter unten im Buch steht noch:</p>
<blockquote>
<p>Verbergen sie keine Funktion der Basisklasse, indem sie die Signatur der Funktion ändern</p>
</blockquote>
<p>Was ich jetzt nicht verstehe: Wenn ich das const in der Redefinition in Dog weglasse, funktioniert trotzdem alles. Ich wüßte nicht, welche Funktion ich verbergen würde?<br />
Kann mir bitte jemand auf die Sprünge helfen?<br />
Oder liegt das an meinem Compiler, das der das da nicht so eng sieht?<br />
Ich verwende den GNU GCC.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/118318/anfängerfrage-zur-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 09:25:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118318.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Aug 2005 10:17:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfängerfrage zur Vererbung on Wed, 17 Aug 2005 10:17:49 GMT]]></title><description><![CDATA[<p>Hei!</p>
<p>Ich lese zur Zeit ein Buch über C++ und bin gerade im Kapitel über Vererbung.<br />
Es wird gerade erklärt, wie man eine Elementfunktion der Basisklasse redefiniert.<br />
Dort heißt es:</p>
<blockquote>
<p>Es ist ein häufiger Fehler, dass man das Schlüsselwort const vergisst.<br />
Das Schlüsselwort const gehört zur Signatur. Lässt man es weg, ändert man die Signatur und verbirgt damit die Methode, statt sie - wie eigentlich beabsichtigt - zu redefinieren.</p>
</blockquote>
<p>Weil ich das ganze nicht vollständig verstanden habe, tippte ich den dazugehörigen Beispielcode mal ab und hab da ein wenig dran rumgespielt, hier der originale Code:</p>
<pre><code>#include &lt;iostream&gt;

class Mammal
{
	public:
		void Move() const
		{
			std::cout &lt;&lt; &quot;Mammal Move...&quot; &lt;&lt; std::endl; 
		}
		void Move(int distance) const
		{
			std::cout &lt;&lt; &quot;Mammal Move... &quot; &lt;&lt; distance &lt;&lt; &quot; Steps!&quot; &lt;&lt; std::endl;
		}
	protected:
		int m_age;
		int m_weight;
};

class Dog: public Mammal
{
	public: 
	void Move() const
	{
		std::cout &lt;&lt; &quot;Dog Move...&quot; &lt;&lt; std::endl;
	}
};

int main(void)
{
	Mammal bigAnimal;
	Dog fido;
	bigAnimal.Move();
	bigAnimal.Move(23);
	fido.Move();
	fido.Mammal::Move(2);
	getchar();
	return 0;
}
</code></pre>
<p>Weiter unten im Buch steht noch:</p>
<blockquote>
<p>Verbergen sie keine Funktion der Basisklasse, indem sie die Signatur der Funktion ändern</p>
</blockquote>
<p>Was ich jetzt nicht verstehe: Wenn ich das const in der Redefinition in Dog weglasse, funktioniert trotzdem alles. Ich wüßte nicht, welche Funktion ich verbergen würde?<br />
Kann mir bitte jemand auf die Sprünge helfen?<br />
Oder liegt das an meinem Compiler, das der das da nicht so eng sieht?<br />
Ich verwende den GNU GCC.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854053</guid><dc:creator><![CDATA[mr.newbie]]></dc:creator><pubDate>Wed, 17 Aug 2005 10:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zur Vererbung on Wed, 17 Aug 2005 10:30:15 GMT]]></title><description><![CDATA[<p>In deinem Beispiel tritt dieser Effekt nicht auf.<br />
Versuche einmal diesen code und dann lass das const bei Dog::move weg. Denke dann wird dir einiges klarer.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

class Mammal 
{ 
    public: 
        virtual void Move() const 
        { 
            std::cout &lt;&lt; &quot;Mammal Move...&quot; &lt;&lt; std::endl; 
        } 
        void Move(int distance) const 
        { 
            std::cout &lt;&lt; &quot;Mammal Move... &quot; &lt;&lt; distance &lt;&lt; &quot; Steps!&quot; &lt;&lt; std::endl; 
        } 
    protected: 
        int m_age; 
        int m_weight; 
}; 

class Dog: public Mammal 
{ 
    public: 
    virtual void Move() const
    { 
        std::cout &lt;&lt; &quot;Dog Move...&quot; &lt;&lt; std::endl; 
    } 
}; 

int main(void) 
{ 
    Mammal * bigAnimal = new Mammal; 
    Mammal * fido = new Dog; 
    bigAnimal-&gt;Move(); 
    fido-&gt;Move(23); 
    fido-&gt;Move(); 
    fido-&gt;Mammal::Move(2); 
    delete bigAnimal;
    delete fido;
    getchar(); 
    return 0; 
}
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854061</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 17 Aug 2005 10:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zur Vererbung on Wed, 17 Aug 2005 10:32:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void Move() const
    {
        std::cout &lt;&lt; &quot;Const Dog Move...&quot; &lt;&lt; std::endl;
    }

void Move()
    {
        std::cout &lt;&lt; &quot;Dog Move...&quot; &lt;&lt; std::endl;
    }
</code></pre>
<p>Implementiere mal beides und dann rufe die Funktion Move einmal bei einem konstanten Objekt auf und bei einem nicht konstanten ...</p>
<p><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/854064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854064</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 17 Aug 2005 10:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zur Vererbung on Wed, 17 Aug 2005 14:18:59 GMT]]></title><description><![CDATA[<p>ich hätte da auch eine Frage...kenn mich noch ned so gut aus mit c++ :</p>
<p>was bringt das &quot;std::&quot; vor dem &quot;cout&quot; ?</p>
<p>ist vielleicht ne blöde frage aber ich hab echt keine ahnung ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854268</guid><dc:creator><![CDATA[hab_keine_ahnung]]></dc:creator><pubDate>Wed, 17 Aug 2005 14:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage zur Vererbung on Wed, 17 Aug 2005 14:25:45 GMT]]></title><description><![CDATA[<p><a href="http://tutorial.schornboeck.net/namespace.htm" rel="nofollow">http://tutorial.schornboeck.net/namespace.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/854276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854276</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Wed, 17 Aug 2005 14:25:45 GMT</pubDate></item></channel></rss>