<?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[Member abstrakter basisklasse in abgeleiteter zugänglich machen]]></title><description><![CDATA[<p>Ich steh komplett auf dem schlauch und verstehe absolut nicht warum folgendes nicht geht. Ich habe Member in einer basisklasse. Soweit ich weiß sollte man basisklassen (wenn sie abstrakt sind) nicht mit konstruktor aufrufen bzw. die member so nicht setzen. deswgen leite ich ab von der basisklasse und setze da über eine initialisierungsliste. Ich dachte es funktinoiert so....aber mitdem code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Affe
{
   public:

        protected:
                int var1;      
};

class Bear : public Affe
{

        public:
                Bear(int var_) : var1(var_) {};
                void foo() {
                        std::cout &lt;&lt; var1 &lt;&lt; std::endl;       
                };
};

int main()
{
    Bear b = Bear(3);
    b.foo();
}
</code></pre>
<p>heißt es dass es keinen feldnamen var1 gibt. Liegt das daran dass Bear noch keinen member abgeleitet hat und über die liste schon versucht wird zu setzen ? Wenn ja - wie kann ich das umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260534/member-abstrakter-basisklasse-in-abgeleiteter-zugänglich-machen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 00:32:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260534.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Feb 2010 15:44:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 15:44:17 GMT]]></title><description><![CDATA[<p>Ich steh komplett auf dem schlauch und verstehe absolut nicht warum folgendes nicht geht. Ich habe Member in einer basisklasse. Soweit ich weiß sollte man basisklassen (wenn sie abstrakt sind) nicht mit konstruktor aufrufen bzw. die member so nicht setzen. deswgen leite ich ab von der basisklasse und setze da über eine initialisierungsliste. Ich dachte es funktinoiert so....aber mitdem code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Affe
{
   public:

        protected:
                int var1;      
};

class Bear : public Affe
{

        public:
                Bear(int var_) : var1(var_) {};
                void foo() {
                        std::cout &lt;&lt; var1 &lt;&lt; std::endl;       
                };
};

int main()
{
    Bear b = Bear(3);
    b.foo();
}
</code></pre>
<p>heißt es dass es keinen feldnamen var1 gibt. Liegt das daran dass Bear noch keinen member abgeleitet hat und über die liste schon versucht wird zu setzen ? Wenn ja - wie kann ich das umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851482</guid><dc:creator><![CDATA[HeinziMeinzi]]></dc:creator><pubDate>Sat, 06 Feb 2010 15:44:17 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 16:54:07 GMT]]></title><description><![CDATA[<p>Ok...also anscheinend liegt es an den templates.</p>
<p>warum geht das hier</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Affe
{
   public:
        Affe(int var_) : var1(var_) {}
        protected:
                int var1;  
                int var2;    
};

class Bear : public Affe
{

        public:
                Bear(int var_) : Affe(var_) {var2 = -2;};
                void foo() {
                        std::cout &lt;&lt; var1 &lt;&lt; std::endl;       
                        var1 = 3;
                        std::cout &lt;&lt; var1 &lt;&lt; std::endl;
                        std::cout &lt;&lt; var2 &lt;&lt; std::endl;
                };
};

int main()
{
    Bear b = Bear(5);
    b.foo();
}
</code></pre>
<p>aber das hier nicht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;class T&gt;
class Affe
{
   public:
        Affe&lt;T&gt;(int var_) : var1(var_) {}
        protected:
                int var1;  
                int var2;    
};

template&lt;class T&gt;
class Bear : public Affe&lt;T&gt;
{

        public:
                Bear&lt;T&gt;(int var_) : Affe&lt;T&gt;(var_) {var2 = -2;};
                void foo() {
                        std::cout &lt;&lt; var1 &lt;&lt; std::endl;       
                        var1 = 3;
                        std::cout &lt;&lt; var1 &lt;&lt; std::endl;
                        std::cout &lt;&lt; var2 &lt;&lt; std::endl;
                };
};

int main()
{
    Bear&lt;int&gt; b = Bear&lt;int&gt;(5);
    b.foo();
}
</code></pre>
<pre><code>main.cpp: In constructor »Bear&lt;T&gt;::Bear(int)«:
main.cpp:18: Fehler: »var2« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp: In member function »void Bear&lt;T&gt;::foo()«:
main.cpp:20: Fehler: »var1« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp:23: Fehler: »var2« wurde in diesem Gültigkeitsbereich nicht definiert
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1851520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851520</guid><dc:creator><![CDATA[HeinziMeinzi]]></dc:creator><pubDate>Sat, 06 Feb 2010 16:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:01:22 GMT]]></title><description><![CDATA[<p>So sollte es was werden:</p>
<pre><code class="language-cpp">Affe&lt;T&gt;::var1 = 2;
</code></pre>
<p>btw wo ist deine abstakte Basisklasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851523</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:08:21 GMT]]></title><description><![CDATA[<p>Eh wie meinst du das mit Affe&lt;T&gt;::var1 = 2;<br />
wo soll das stehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851527</guid><dc:creator><![CDATA[HeinziMeinzi]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:11:51 GMT]]></title><description><![CDATA[<p>Kannn ich denn nicht von template-basierten klassen auf member zugreifen?</p>
<p>muss ich dann jedesmall den klassennamen::member angehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851528</guid><dc:creator><![CDATA[HeinziMeinzi]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:13:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class T&gt; 
class Bear : public Affe&lt;T&gt; 
{ 

        public: 
                Bear&lt;T&gt;(int var_) : Affe&lt;T&gt;(var_) {}
                void foo() { 
                        std::cout &lt;&lt; Affe&lt;T&gt;::var1 &lt;&lt; std::endl;       
                        Affe&lt;T&gt;::var1 = 3; 
                        std::cout &lt;&lt; Affe&lt;T&gt;::var1 &lt;&lt; std::endl; 
                        std::cout &lt;&lt; Affe&lt;T&gt;::var2 &lt;&lt; std::endl; 
                }; 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1851531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851531</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:15:19 GMT]]></title><description><![CDATA[<p>danke dir aber muss ich dann wirklich IMMER den klassennamen angeben? geht das nicht anders auch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851535</guid><dc:creator><![CDATA[HeinziMeinzi]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:22:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T&gt;
class Bear : public Affe&lt;T&gt; {
  using Affe&lt;T&gt;::var2; // &lt;--

public:
  void foo() {
    var2 = 2;
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1851540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851540</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:22:45 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:31:26 GMT]]></title><description><![CDATA[<p>ok vielen dank. jetzt würde mir aber glaube ich eine erklärung gut tun...warum gibt es da einen unterschied und warum geht das nur so? tut mir leid für die dumme frage...aber ich verstehe nicht warum es bei templates einen unterschied macht.</p>
<p>danke für weitere erklärungen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851547</guid><dc:creator><![CDATA[HeinziMeinzi]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:47:52 GMT]]></title><description><![CDATA[<p>Du kennst es so, wenn eine Klasse eine andere Klasse erweitert, dann kannst du Member der Basisklasse zugreifen, weil die Erweiterung in gleichen Gültikeitsbereich stattfindet. Die Instanzierung eines Typens hat ihren eigenen Gültigkeitsbereich. Wenn du aber eine Klassentemplate schreibst, bist du selbst in keine Instanz eines Typen drin, daher muss diese Information expliziet angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851552</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 17:50:47 GMT]]></title><description><![CDATA[<p>Kurze Antwort: Steht so im Standard.</p>
<p>Ich nehme an, der Grund sind Spezialisierungen und ungewollte und -übersichtliche Nebeneffekte. Nimm etwa</p>
<pre><code class="language-cpp">typedef double value_t;

template&lt;typename T&gt; struct A {};
template&lt;typename T&gt; struct B : public A&lt;T&gt; {
  value_t x;
};

template&lt;&gt; struct A&lt;int&gt; { typedef int value_t; };

// ...

B&lt;int&gt; b; // b.x bleibt double.
</code></pre>
<p>Der Compiler geht davon aus, dass der Autor von B sich darauf verlässt, dass value_t die im globalen Namensraum definierten Eigenschaften besitzt. Wenn eine Überdeckung durch bestimmte Eigenschaften von A gewünscht ist, kann es halt per using-Direktive erklärt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851554</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Feb 2010 17:50:47 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 18:35:24 GMT]]></title><description><![CDATA[<p>-.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851573</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sat, 06 Feb 2010 18:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 19:13:21 GMT]]></title><description><![CDATA[<p>@seldon<br />
Ich meine gelesen zu haben, dass man class anstatt typename vorziehen sollte wenn man weiß, das eine Klasse übergeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851584</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Sat, 06 Feb 2010 19:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 19:18:14 GMT]]></title><description><![CDATA[<p>Kóyaánasqatsi schrieb:</p>
<blockquote>
<p>@seldon<br />
Ich meine gelesen zu haben, dass man class anstatt typename vorziehen sollte wenn man weiß, das eine Klasse übergeben wird.</p>
</blockquote>
<p>Spielt überhaupt keine Rolle. Sind völlig äquivalent.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851587</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 06 Feb 2010 19:18:14 GMT</pubDate></item><item><title><![CDATA[Reply to Member abstrakter basisklasse in abgeleiteter zugänglich machen on Sat, 06 Feb 2010 20:29:26 GMT]]></title><description><![CDATA[<p>Nahezu äquivalent. Man kann etwa</p>
<pre><code class="language-cpp">template&lt;template&lt;typename&gt; class TT&gt;
struct A { };
</code></pre>
<p>nicht als</p>
<pre><code class="language-cpp">template&lt;template&lt;typename&gt; typename TT&gt; // Fehler!
struct A { };
</code></pre>
<p>schreiben. Ansonsten ist es Geschmackssache, welches Schlüsselwort man benutzt - ich bevorzuge typename, weil es mir klarer erscheint (die Vorlage wird ja durch die Benutzung von &quot;class&quot; nicht auf Klassen beschränkt), aber man könnte mit hinreichend mathematischer Anschauungsweise den Standpunkt vertreten, dass Basistypen auch Klassen (von Objekten) sind.</p>
<p>class zu schreiben, um zu signalisieren, dass man eine Klasse erwartet, scheint mir aber nicht sonderlich sinnvoll - man erwartet ja in so einem Fall nicht irgendeine Klasse, sondern eine Klasse, die bestimmte Anforderungen, die die Vorlage benötigt, erfüllt. Das muss man dann eh sinnvoll dokumentieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851610</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Feb 2010 20:29:26 GMT</pubDate></item></channel></rss>