<?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[Implizite Konstruktoren&#x2F;Zuweisungsoperatoren]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich bin ein wenig verwirrt was implizit generierte Konstruktoren/Zuweisungsoperatoren angeht.<br />
Wenn keine Vererbung im Spiel ist, ist mir das klar, denke ich.</p>
<p>Folgenden Fall verstehe ich dagegen nicht ganz.</p>
<pre><code>class Base
{
public:
    Base();
    virtual ~Base() = 0;

    void DoSomeStuff(){ /* do some stuff */ };
}
</code></pre>
<p>Wenn ich nun eine nicht abstrakte Ableitung haben möchte, muss ich den Destruktor implementieren und sei es nur als default-Variante.</p>
<pre><code>class Derived : public Base
{
    Derived();
    virtual ~Derived() = default;

    void DoSomeStuff();
}
</code></pre>
<p>Wegen des implementierten Destruktors wird mir hier aber kein Move-Konstruktor implizit generiert, richtig?</p>
<p>Da ich doch im Fall von Vererbung immer einen virtuellen Destruktor bereitstellen sollte, muss ich also spätestens in der ersten nicht abstrakten Ableitung immer Move-Konstruktor und Move-Zuweisung explizit implementieren (ggf. default).<br />
Wenn ich also Move-Support haben möchte, müsste meine Ableitung so aussehen.</p>
<pre><code>class Derived : public Base
{
    Derived();
    virtual ~Derived() = default;

    Derived(Derived&amp;&amp;) = default;
    Derived&amp; operator=(Derived&amp;&amp;) = default;

    void DoSomeStuff();
}
</code></pre>
<p>...und am besten der Vollständigkeit halber auch noch Copy-Kontruktor und Zuweisungsoperator ebenfalls als default?</p>
<p>Wäre nett, wenn mir das jemand bestätigen oder eben korrigieren könnte.<br />
Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339869/implizite-konstruktoren-zuweisungsoperatoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 17:09:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339869.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Oct 2016 14:33:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implizite Konstruktoren&#x2F;Zuweisungsoperatoren on Tue, 04 Oct 2016 14:33:38 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich bin ein wenig verwirrt was implizit generierte Konstruktoren/Zuweisungsoperatoren angeht.<br />
Wenn keine Vererbung im Spiel ist, ist mir das klar, denke ich.</p>
<p>Folgenden Fall verstehe ich dagegen nicht ganz.</p>
<pre><code>class Base
{
public:
    Base();
    virtual ~Base() = 0;

    void DoSomeStuff(){ /* do some stuff */ };
}
</code></pre>
<p>Wenn ich nun eine nicht abstrakte Ableitung haben möchte, muss ich den Destruktor implementieren und sei es nur als default-Variante.</p>
<pre><code>class Derived : public Base
{
    Derived();
    virtual ~Derived() = default;

    void DoSomeStuff();
}
</code></pre>
<p>Wegen des implementierten Destruktors wird mir hier aber kein Move-Konstruktor implizit generiert, richtig?</p>
<p>Da ich doch im Fall von Vererbung immer einen virtuellen Destruktor bereitstellen sollte, muss ich also spätestens in der ersten nicht abstrakten Ableitung immer Move-Konstruktor und Move-Zuweisung explizit implementieren (ggf. default).<br />
Wenn ich also Move-Support haben möchte, müsste meine Ableitung so aussehen.</p>
<pre><code>class Derived : public Base
{
    Derived();
    virtual ~Derived() = default;

    Derived(Derived&amp;&amp;) = default;
    Derived&amp; operator=(Derived&amp;&amp;) = default;

    void DoSomeStuff();
}
</code></pre>
<p>...und am besten der Vollständigkeit halber auch noch Copy-Kontruktor und Zuweisungsoperator ebenfalls als default?</p>
<p>Wäre nett, wenn mir das jemand bestätigen oder eben korrigieren könnte.<br />
Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510503</guid><dc:creator><![CDATA[movesupport]]></dc:creator><pubDate>Tue, 04 Oct 2016 14:33:38 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konstruktoren&#x2F;Zuweisungsoperatoren on Tue, 04 Oct 2016 14:36:49 GMT]]></title><description><![CDATA[<p>&quot;DoSomeStuff&quot; war jetzt nicht ganz glücklich gewählt für das Beispiel.<br />
In der Basisklasse ebenfalls virtual und mit entsprechendem override-specifier in den Ableitungen wäre sinnvoller gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510505</guid><dc:creator><![CDATA[movesupport]]></dc:creator><pubDate>Tue, 04 Oct 2016 14:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konstruktoren&#x2F;Zuweisungsoperatoren on Tue, 04 Oct 2016 14:38:06 GMT]]></title><description><![CDATA[<p>...und das &quot;public&quot; in &quot;Derived&quot; fehlt natürlich ebenfalls, sorry!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510506</guid><dc:creator><![CDATA[movesupport]]></dc:creator><pubDate>Tue, 04 Oct 2016 14:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konstruktoren&#x2F;Zuweisungsoperatoren on Tue, 04 Oct 2016 16:51:55 GMT]]></title><description><![CDATA[<p>Such mal nach &quot;Rule of 3&quot; bzw. seit C++11 auch &quot;Rule of 5&quot;. Oder &quot;Rule of zero&quot;.</p>
<p>Im Prinzip: 0, 3 oder 5 Dinge implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510526</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Tue, 04 Oct 2016 16:51:55 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konstruktoren&#x2F;Zuweisungsoperatoren on Tue, 04 Oct 2016 17:39:57 GMT]]></title><description><![CDATA[<p>AFAIK musst du alles deklarieren und das auch schon in der Basis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510531</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 04 Oct 2016 17:39:57 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konstruktoren&#x2F;Zuweisungsoperatoren on Tue, 04 Oct 2016 18:28:35 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise! Inzwischen habe ich selbst nochmal ein wenig herumprobiert und recherchiert. Mein wesentlicher Denkfehler war der, dass der pure virtual Destruktor in der Basisklasse implementiert werden <strong>muss</strong>, wenn es zumindest eine konkrete Ableitung gibt.</p>
<p>wob  schrieb:</p>
<blockquote>
<p>&quot;Rule of 3&quot; bzw. seit C++11 auch &quot;Rule of 5&quot;</p>
</blockquote>
<p>Die &quot;Rule of 3&quot;, &quot;Rule of 5&quot; oder auch &quot;Rule of 4 1/2&quot; ist mir schon bekannt. Die greift aber eigentlich dann, wenn die Default-Implementierung für eine Klasse eben <strong>nicht</strong> ausreicht.<br />
In der abstrakten Basisklasse ist die Default-Implementierung hingegen ausreichend und die Deklaration des Destruktors ist nur erforderlich, um die Klasse abstrakt zu machen (z.B. mangels anderer Methoden).<br />
Ist allerdings ein benutzerdefinierter Destruktor vorhanden, werden Move-Konstruktor und Move-Zuweisung nicht implizit generiert und meine Frage zielte darauf, wie man den Move-Support in diesem Fall bekommt. Ob es tatsächlich notwendig ist, beide explizit (default-Implementierung) zu definieren.</p>
<p>Nachdem mir jetzt klar gewordern ist, dass der pure virtual Destruktor bereits in der Basisklasse implementiert werden muss, würde mein Entwurf vermutlich so aussehen.</p>
<pre><code>class Base
{
public:
    Base(){}
    virtual ~Base() = 0 {} // evtl. besser im cpp

    Base(Base&amp;&amp;) = default;
    Base&amp; operator=(Base&amp;&amp;) = default;

    // und der Vollständigkeit halber
    Base(const Base&amp;) = default;
    Base&amp; operator=(const Base&amp;) = default;
};

class Derived : public Base
{
public:
    Derived() {}
};
</code></pre>
<p>Weil Base abstrakt ist und keine Daten-Member hat, kann man aber vielleicht auch einfach auf die default-Implementierungen von move/copy verzichten... In einer Ableitung, die selbst keinen Destruktor definiert/braucht, müsste dann implizit alles bereitgestellt werden und sobald es doch eine konkrete Destruktor-Implementierung geben muss, greift wieder die &quot;Rule of 5&quot; (3, 4 1/2)...?</p>
<pre><code>class Base
{
public:
    virtual ~Base() = 0 {} // evtl. besser im cpp
};

class Derived : public Base
{
public:

protected:
    std::vector&lt;int&gt; m_foo;
};
</code></pre>
<p>Wie hier die Best Practice aussieht bin ich mir aber immer noch nicht so ganz sicher...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510541</guid><dc:creator><![CDATA[movesupport]]></dc:creator><pubDate>Tue, 04 Oct 2016 18:28:35 GMT</pubDate></item></channel></rss>