<?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[virtual Ungewissheit]]></title><description><![CDATA[<p>Diese beiden Klassen seien gegeben:</p>
<pre><code class="language-cpp">class Base{
// ...
public:
virtual void func();
};

class Middle{
// ...
public:
virtual void func();
};
</code></pre>
<p>Jetzt möchte ich eine Klasse von Middle ableiten, für die es allerdings ausreichend wäre, wenn die Version von func() aus der Klasse Middle aufgerufen würde:</p>
<pre><code class="language-cpp">class Final{
// ...
public:
// Hier jetzt das Problem, wenn ich hier die Funktion noch einmal
// deklariere, dann muss ich sie ja Final::func() noch einmal implementieren,
// obwohl eigentlich ja die Version aus Middle() ausreichend
// wäre.

// Wenn ich die Funktion hier nicht deklariere, dann kennt der Compiler
// Final::func() nicht

// Als Gipfel des Eisbergs liegt die Implementierung der Funktion aus
// Middle nur in kompilierter Version vor, Cut &amp; Paste geht deshalb auch nicht
};
</code></pre>
<p>Gibt es die Möglichkeit, dass man die Funktion in Final noch einmal definiert, und dann von dort aus 'irgendwie' 'einfach' die Parameter an die Funktionsversion aus Middle weitergibt?<br />
Oder wird hier irgend eine nicht vorhersehbare Version von func() aufgerufen:</p>
<pre><code class="language-cpp">Base* T = new Final();

T-&gt;func(); // angenommen in Final ist func() nicht deklariert.
      // was geschieht dann? wird dann einfach irgend eine func()-Version
      // aus einer der Basisklassen aufgerufen ?

   // Und andernfalls, wenn man in Final die func() nun doch nocheinmal
   // anlegt, wie gelingt es dann, dass von dieser Final-func()-Funktion
   // aus zu einer func()-Version in einer der vorangegangenen Klassen
   // gesprungen wird ?

   // Irgendwie so: return ((Middle*)this)-&gt;func() ??? (C-Cast womöglich?)
</code></pre>
<p>Thx für tipps</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185440/virtual-ungewissheit</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:20:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185440.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Jun 2007 16:13:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual Ungewissheit on Mon, 25 Jun 2007 16:13:36 GMT]]></title><description><![CDATA[<p>Diese beiden Klassen seien gegeben:</p>
<pre><code class="language-cpp">class Base{
// ...
public:
virtual void func();
};

class Middle{
// ...
public:
virtual void func();
};
</code></pre>
<p>Jetzt möchte ich eine Klasse von Middle ableiten, für die es allerdings ausreichend wäre, wenn die Version von func() aus der Klasse Middle aufgerufen würde:</p>
<pre><code class="language-cpp">class Final{
// ...
public:
// Hier jetzt das Problem, wenn ich hier die Funktion noch einmal
// deklariere, dann muss ich sie ja Final::func() noch einmal implementieren,
// obwohl eigentlich ja die Version aus Middle() ausreichend
// wäre.

// Wenn ich die Funktion hier nicht deklariere, dann kennt der Compiler
// Final::func() nicht

// Als Gipfel des Eisbergs liegt die Implementierung der Funktion aus
// Middle nur in kompilierter Version vor, Cut &amp; Paste geht deshalb auch nicht
};
</code></pre>
<p>Gibt es die Möglichkeit, dass man die Funktion in Final noch einmal definiert, und dann von dort aus 'irgendwie' 'einfach' die Parameter an die Funktionsversion aus Middle weitergibt?<br />
Oder wird hier irgend eine nicht vorhersehbare Version von func() aufgerufen:</p>
<pre><code class="language-cpp">Base* T = new Final();

T-&gt;func(); // angenommen in Final ist func() nicht deklariert.
      // was geschieht dann? wird dann einfach irgend eine func()-Version
      // aus einer der Basisklassen aufgerufen ?

   // Und andernfalls, wenn man in Final die func() nun doch nocheinmal
   // anlegt, wie gelingt es dann, dass von dieser Final-func()-Funktion
   // aus zu einer func()-Version in einer der vorangegangenen Klassen
   // gesprungen wird ?

   // Irgendwie so: return ((Middle*)this)-&gt;func() ??? (C-Cast womöglich?)
</code></pre>
<p>Thx für tipps</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313492</guid><dc:creator><![CDATA[Virtuall]]></dc:creator><pubDate>Mon, 25 Jun 2007 16:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to virtual Ungewissheit on Mon, 25 Jun 2007 16:50:01 GMT]]></title><description><![CDATA[<p>vorausgesetzt, die funktionen sind implementiert:</p>
<pre><code class="language-cpp">class Base{
// ...
public:
virtual void func();
};

class Middle : public Base {
// ...
public:
virtual void func(); //func ist implizit virtual. virtual ist hier also überflüssig (weil base::func virtual ist)
}; 

class Final : public Middle
{
};

int main ()
{
   Final f;
   f.func();

   Base &amp;b = f;
   b.func();
}
</code></pre>
<p>ruft beide male middle::func auf.<br />
probleme bekommst du, wenn du in Final eine funktion deklarierst, die middle::func verdeckt:</p>
<pre><code class="language-cpp">class Final : public Middle
{
public:
   void func (int);
};
</code></pre>
<p>in diesem fall hast du die möglichkeit mit using middle::func wieder sichtbar zu machen:</p>
<pre><code class="language-cpp">class Final : public Middle
{
public:
   void func (int);
   using Middle::func;
}
</code></pre>
<p>Virtuall schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Base* T = new Final();

T-&gt;func(); // angenommen in Final ist func() nicht deklariert.
      // was geschieht dann? wird dann einfach irgend eine func()-Version
      // aus einer der Basisklassen aufgerufen ?

   // Und andernfalls, wenn man in Final die func() nun doch nocheinmal
   // anlegt, wie gelingt es dann, dass von dieser Final-func()-Funktion
   // aus zu einer func()-Version in einer der vorangegangenen Klassen
   // gesprungen wird ?

   // Irgendwie so: return ((Middle*)this)-&gt;func() ??? (C-Cast womöglich?)
</code></pre>
</blockquote>
<p>hier wird Middle::func aufgerufen. wenn func in Final nochmal definiert wird, wird Final::func aufgerufen. es wird immer diejenige funktion aufgerufen, die zum &quot;richtigen&quot; (dynamischen) typ gehört. wenn du innerhalb von final eine ganz bestimmte version von func aufrufen willst, kannst du folgendes machen:</p>
<pre><code class="language-cpp">void Final::func ()
{
  this-&gt;Middle::func(); //wahlweise auch ohne this-&gt;
  this-&gt;Base::func();
}
</code></pre>
<p>dasselbe funktioniert von außerhalb:</p>
<pre><code class="language-cpp">Final f;
f.Middle::func();
f.Base::func();
</code></pre>
<p>allerdings nicht bei zeigern auf die basisklasse:</p>
<pre><code class="language-cpp">Base *b = new Final;
//b-&gt;Middle::func(); //fehler: Middle ist keine basisklasse von Base
b-&gt;Base::func(); //das funktioniert natürlich schon und ruft Base::func auf.
//hier kannst du mit dynamic_cast (oder static_cast, ist aber nur in bestimmten fällen richtig) downcasten und danach die gewünschte methode aufrufen:
dynamic_cast&lt;Final*&gt;(b)-&gt;Middle::func(); //bspw.
delete b;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1313521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313521</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 25 Jun 2007 16:50:01 GMT</pubDate></item><item><title><![CDATA[Reply to virtual Ungewissheit on Mon, 25 Jun 2007 17:12:47 GMT]]></title><description><![CDATA[<p>Danke für die ausführliche Antwort! <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/1313541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313541</guid><dc:creator><![CDATA[Virtuall]]></dc:creator><pubDate>Mon, 25 Jun 2007 17:12:47 GMT</pubDate></item></channel></rss>