<?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[Interfaces in C++]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>ich habe mal ein bisschen herumgechaut, wie es möglich ist etwas zu implementieren, was Interfaces ähnelt. Bei der Suche bin ich auf folgende Herangehensweisen gestoßen:</p>
<pre><code class="language-cpp">class IDemo {
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

class Parent {
    public:
        virtual ~Parent();
};

class Child : public Parent, public IDemo {
    public:
        virtual void OverrideMe() { /* do stuff */ }
};
</code></pre>
<p>Hier im ersten Beispiel wird mit puren virtuellen Funktionen gearbeitet. Bei Diskussionen habe ich gelesen, dass nicht alle den Destruktor virtuell machen und manche diesen auch protected deklarieren. Was ist besser? Soll er dann nochmals korrekt implementiert werden mit <code>IDemo::~IDemo {}</code> ?</p>
<p>Was kann man zu folgender Idee sagen?</p>
<pre><code class="language-cpp">struct __declspec(novtable) IFoo {
    virtual void Bar();
};

class Child : public IFoo {
    public:
        virtual void Bar() { /* do something */ }
};
</code></pre>
<p>Dies ist zwar nur mit Microsoft-Compilern machbar, aber ich würde gerne wissen, was es hier zu sagen gibt. Ist die auch irgendwie auf Linux mit gcc übertragbar?</p>
<p>Zuletzt: Ich habe gesehen, dass Microsoft das <code>__interface</code> -Schlüsselwort kennt in Visual Studio. Wie ist damit zu arbeiten?</p>
<p>Gruß,<br />
Christian</p>
<p>PS: Ich weiß, dass andere Sprachen wir Java/C# Interfaces definieren, weil diese nicht mit Mehrfachvererbung umgehen können, aber es interessiert mich dennoch! Zudem könnte es auch für hier (<a href="http://www.c-plusplus.net/forum/279783" rel="nofollow">http://www.c-plusplus.net/forum/279783</a>) nützlich sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Außerdem habe ich jetzt eine Ringabhängigkeit bzw. Rekursion drin.</p>
<p>PPS: Wie kann man einen Text anstatt des Links anzeigen beim URL-BBCode?!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279786/interfaces-in-c</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 10:09:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279786.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Jan 2011 17:06:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 17:40:22 GMT]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>ich habe mal ein bisschen herumgechaut, wie es möglich ist etwas zu implementieren, was Interfaces ähnelt. Bei der Suche bin ich auf folgende Herangehensweisen gestoßen:</p>
<pre><code class="language-cpp">class IDemo {
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

class Parent {
    public:
        virtual ~Parent();
};

class Child : public Parent, public IDemo {
    public:
        virtual void OverrideMe() { /* do stuff */ }
};
</code></pre>
<p>Hier im ersten Beispiel wird mit puren virtuellen Funktionen gearbeitet. Bei Diskussionen habe ich gelesen, dass nicht alle den Destruktor virtuell machen und manche diesen auch protected deklarieren. Was ist besser? Soll er dann nochmals korrekt implementiert werden mit <code>IDemo::~IDemo {}</code> ?</p>
<p>Was kann man zu folgender Idee sagen?</p>
<pre><code class="language-cpp">struct __declspec(novtable) IFoo {
    virtual void Bar();
};

class Child : public IFoo {
    public:
        virtual void Bar() { /* do something */ }
};
</code></pre>
<p>Dies ist zwar nur mit Microsoft-Compilern machbar, aber ich würde gerne wissen, was es hier zu sagen gibt. Ist die auch irgendwie auf Linux mit gcc übertragbar?</p>
<p>Zuletzt: Ich habe gesehen, dass Microsoft das <code>__interface</code> -Schlüsselwort kennt in Visual Studio. Wie ist damit zu arbeiten?</p>
<p>Gruß,<br />
Christian</p>
<p>PS: Ich weiß, dass andere Sprachen wir Java/C# Interfaces definieren, weil diese nicht mit Mehrfachvererbung umgehen können, aber es interessiert mich dennoch! Zudem könnte es auch für hier (<a href="http://www.c-plusplus.net/forum/279783" rel="nofollow">http://www.c-plusplus.net/forum/279783</a>) nützlich sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Außerdem habe ich jetzt eine Ringabhängigkeit bzw. Rekursion drin.</p>
<p>PPS: Wie kann man einen Text anstatt des Links anzeigen beim URL-BBCode?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001887</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Jan 2011 17:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 17:56:12 GMT]]></title><description><![CDATA[<p>Wenn du genaues Gegenstück haben möchtest zu einem Interface, dann mach eine Klasse, die nur reine virtuelle Funktionen (pure virtual funtions) hat.</p>
<p>Wenn du eine abstrakte Klasse haben möchtest, die aber ein par konkrete Funktionen enthält, empfiehlt es sich den Destruktor rein virtuellzu deklarieren. Eine Klasse, von der du erben möchtest, sollte allerdings IMMER einen virtuellen Destruktor haben, egal ob die Klasse abstrakt oder &quot;konkret&quot; ist.</p>
<p>Ich denke nicht, dass die Leute den Destruktor, sondern den Konstruktor protected machen. Der Unterschied ist dann, dass man trotzdem noch Instanzen der Klasse erzeugen können, einfach nicht mehr von überall her (soweit ich weiss nur aus abgeleiteten Klassen heraus). Wenn ich also eine abstrakte Klasse brauche, dann mach ich sie wirklich virtuell und deklariere nicht einfach den Ctor als protected.</p>
<p>Bemerkung: Rein virtuelle Funktionen (pure virtual functions) und virtuelle Funktionen (virtual functions) sind nicht das selbe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001908</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 03 Jan 2011 17:56:12 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 18:00:46 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Bemerkung: Rein virtuelle Funktionen (pure virtual functions) und virtuelle Funktionen (virtual functions) sind nicht das selbe.</p>
</blockquote>
<p>Dessen bin ich mir bewusst <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>
<p>Aber dennoch würde ich wissen, welche Herangehensweise du in diesem Fall empfiehlst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001912</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 18:05:51 GMT]]></title><description><![CDATA[<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>Hier im ersten Beispiel wird mit puren virtuellen Funktionen gearbeitet. Bei Diskussionen habe ich gelesen, dass nicht alle den Destruktor virtuell machen und manche diesen auch protected deklarieren. Was ist besser?</p>
</blockquote>
<p>Die Frage ist doch ganz einfach mit einer Gegenfrage zu beantworten: Brauchst Du denn einen virtuellen Destruktor? Hintergrund: Ein virtueller Destruktor wird benötigt, wenn &quot;polymorph löschen&quot; willst, also delete auf einen Basis-Klassen-Zeiger aufrufen möchtest, welcher ggf auf ein Objekt einer von der Basisklasse abgeleiteten Klasse zeigt. Deklariest Du den Destruktor als protected, dann wird ein &quot;delete base_ptr;&quot; nicht mehr kompilieren. Du darfst dann das virtual natürlich weglassen, weil es damit überflüssig geworden ist.</p>
<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>Soll er dann nochmals korrekt implementiert werden mit <code>IDemo::~IDemo {}</code> ?</p>
</blockquote>
<p>Was verstehst Du unter &quot;korrekt implementiert&quot;?</p>
<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>Was kann man zu folgender Idee sagen?</p>
<pre><code class="language-cpp">struct __declspec(novtable) IFoo {
    virtual void Bar();
};

class Child : public IFoo {
    public:
        virtual void Bar() { /* do something */ }
};
</code></pre>
<p>Dies ist zwar nur mit Microsoft-Compilern machbar, aber ich würde gerne wissen, was es hier zu sagen gibt.</p>
</blockquote>
<p>Frag Microsoft. Das ist kein Standard-C++. Ich kann mir das jetzt auch nicht zusammenreimen, was da passiert bzw passieren soll.</p>
<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>Ist die auch irgendwie auf Linux mit gcc übertragbar?</p>
</blockquote>
<p>Was willst Du überhaupt damit erreichen?</p>
<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>Zuletzt: Ich habe gesehen, dass Microsoft das <code>__interface</code> -Schlüsselwort kennt in Visual Studio. Wie ist damit zu arbeiten?</p>
</blockquote>
<p>Keine Ahnung. Falsches Forum würde ich sagen.</p>
<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>PPS: Wie kann man einen Text anstatt des Links anzeigen beim URL-BBCode?!</p>
</blockquote>
<p>So:<br />
(url=http://www.example.com)test(/url)<br />
wobei () durch [] zu ersetzen ist.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001920</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 18:09:35 GMT]]></title><description><![CDATA[<p>Christian Ivicevic schrieb:</p>
<blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Bemerkung: Rein virtuelle Funktionen (pure virtual functions) und virtuelle Funktionen (virtual functions) sind nicht das selbe.</p>
</blockquote>
<p>Dessen bin ich mir bewusst <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>
<p>Aber dennoch würde ich wissen, welche Herangehensweise du in diesem Fall empfiehlst?</p>
</blockquote>
<p>Nur weil du geschrieben hast, dass einige empfehlen den Destruktor virtuel zu machen, um eine abstrakte Klasse zu erhalten. Virtuell muss der Destruktor in einer Basisklasse sowiso sein. Du brauchst einen rein virtuellen Destruktor, damit die Klasse abstrakt wird.</p>
<p>Wie gesagt, wenn du ein Interface machen willst, mache eine Klasse, die nur rein virtuelle Funktionen enthält. Aber wie ich schon im anderen Thread geschrieben habe: Aufpassen, C++ != Java <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/2001923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001923</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:09:35 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 18:14:46 GMT]]></title><description><![CDATA[<p>Das mit dem <a href="http://msdn.microsoft.com/en-us/library/k13k85ky.aspx" rel="nofollow">novtable</a> ist in der MSDN-Library genauer erklärt.</p>
<p><code>__interface</code> werde ich weiter nachgooglen.</p>
<p>Fred Larson schrieb:</p>
<blockquote>
<p>An alternative to a virtual destructor is a protected destructor. This disables polymorphic destruction, which may be more appropriate in some circumstances. Look at <a href="http://www.gotw.ca/publications/mill18.htm" rel="nofollow">Guideline #4</a>!</p>
</blockquote>
<p>Evan Teran schrieb:</p>
<blockquote>
<p>you should have a do nothing destructor in IDemo so that it is defined behavior to do: <code>IDemo *p = new Child; /*whatever */ delete p;</code></p>
</blockquote>
<p>Mit den URLS hab ich die URL und den Text immer vertauscht <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/2001925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001925</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:14:46 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Mon, 03 Jan 2011 18:23:23 GMT]]></title><description><![CDATA[<p>Also wenn das Objekt polymorph gelöscht werden soll, dann muss der Destruktor virtuell sein.<br />
Es gibt aber auch Situationen, in denen man das Objekt nicht polymorph löschen können soll. Wenn ein Destruktor aufgerufen wird, der nicht virtuell ist, gibt das undefiniertes Verhalten. Wenn du dann den Destruktor protected machst, dann bekommst du einen Compilation-Error, wenn du versuchst delete zu machen, was natürlich besser ist als undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001931</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:23:23 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Tue, 04 Jan 2011 00:32:44 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Eine Klasse, von der du erben möchtest, sollte allerdings IMMER einen virtuellen Destruktor haben, egal ob die Klasse abstrakt oder &quot;konkret&quot; ist.</p>
</blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Virtuell muss der Destruktor in einer Basisklasse sowiso sein.</p>
</blockquote>
<p>Nein, nein. Ein Destruktor muss virtuell sein, wenn die Klasse polymorph benutzt wird. Aus Vererbung folgt noch lange keine Polymorphie, was leider viele Programmierer übersehen.</p>
<p>Siehe auch <a href="http://www.c-plusplus.net/forum/277905-10" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002023</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Jan 2011 00:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Tue, 04 Jan 2011 02:32:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Bei Diskussionen habe ich gelesen, dass nicht alle den Destruktor virtuell machen und manche diesen auch protected deklarieren.</p>
</blockquote>
<p>Das eine hat nichts mit dem anderen zu tun.</p>
<blockquote>
<p>Wenn ich also eine abstrakte Klasse brauche, dann mach ich sie wirklich virtuell und deklariere nicht einfach den Ctor als protected.</p>
</blockquote>
<p>Das ist gehopt wie gesprungen.</p>
<blockquote>
<p>Aber dennoch würde ich wissen, welche Herangehensweise du in diesem Fall empfiehlst?</p>
</blockquote>
<p>Das Thema ist zu komplex, als das es hier im Forum detailiert erlaeutert werden kann. Wenn du schon so viel gelesen hast, dann stelle eine konkrete Frage. Am besten eine, die mit Ja/Nein beantwortet werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002046</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 04 Jan 2011 02:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Tue, 04 Jan 2011 08:27:14 GMT]]></title><description><![CDATA[<p>@ Nexus<br />
Habe mir gerade den anderen Thread durchgelesen. Ich hatte noch nie an solche Beispiele gedacht, da in anderen Sprachen Vererbung Polymorphie impliziert. Ich finde das allerdings ziemlich gefährlich. Aber jenachdem kann das vielleicht sinnvoll sein, habe zu wenig Wissen und Erfahrung, um das beurteilen zu können.</p>
<p>Ich änder dann mal die Aussage, dass man den Destruktor virtuell machen muss, wenn die Klasse polymorph verwendet werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002084</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 04 Jan 2011 08:27:14 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces in C++ on Tue, 04 Jan 2011 09:40:31 GMT]]></title><description><![CDATA[<p>Die alte Regel für Basis Klassen: Destruktor entweder <strong>public virtual</strong> oder <strong>protected non-virtual</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002119</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 04 Jan 2011 09:40:31 GMT</pubDate></item></channel></rss>