<?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 inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen]]></title><description><![CDATA[<p>Hallo liebe Community,</p>
<p>also angenommen ich habe eine abstrakte Klasse namens wrapper, die wie folgt implementiert ist:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class wrapper{
protected:
    Type* ptr;

public:
    // constructors
    wrapper() : ptr(nullptr) {}
    wrapper(Type&amp; type) : ptr(std::addressof(type)) {}

    virtual ~wrapper() = 0;
};

template&lt;typename Type&gt;
wrapper&lt;Type&gt;::~wrapper() {}
</code></pre>
<p>Nun implementiere ich eine weitere abstrakte Klasse namens iterator_wrapper, die aufgrund einer Vererbungsorgie virtuell von der wrapper-Klasse erbt:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class iterator_wrapper : virtual public wrapper&lt;Type&gt;{

public:
    iterator_wrapper() = default;
    iterator_wrapper(Type&amp; type) : wrapper&lt;Type&gt;(type) {}

    typedef typename Type::iterator iterator;

    virtual ~iterator_wrapper() = 0;

    iterator begin() const { return wrapper&lt;Type&gt;::ptr-&gt;begin(); }
    iterator end()   const { return wrapper&lt;Type&gt;::ptr-&gt;end(); }
};

template&lt;typename Type&gt;
iterator_wrapper&lt;Type&gt;::~iterator_wrapper() {}
</code></pre>
<p>Und nun die Klasse im Einsatz. Dazu schreib ich mir eine Test-Klasse namens &quot;Example&quot; und teste somit ob die iterator_wrapper-Klasse funktioniert.</p>
<pre><code class="language-cpp">/*** Hier die abstrakten Klassen ***/

class Example : public iterator_wrapper&lt;std::vector&lt;int&gt;&gt;{
    std::vector&lt;int&gt; vec;

public:
    Example() : iterator_wrapper&lt;decltype(vec)&gt;(vec){
        vec = {1, 2, 3, 4, 5};
    }
};

int main(){
    for(const auto&amp; xyz : Example()); // SEGFAULT
    return 0;
}
</code></pre>
<p>Das Segfault entsteht, weil aus irgend einem unbekannten Grund dennoch der Default Constructor der Klasse <code>wrapper</code> aufgerufen wird. Beachtet, dass ich in den Initialisierungslisten jedoch diesen nicht aufrufe!</p>
<p><code>Example::Example()</code> ruft <code>iterator_wrapper&lt;Type&gt;::iterator_wrapper(Type&amp;)</code> auf.<br />
<code>iterator_wrapper&lt;Type&gt;::iterator_wrapper(Type&amp;)</code> <strong>sollte</strong> <code>wrapper&lt;Type&gt;::wrapper(Type&amp;)</code> aufrufen.</p>
<p>Stattdessen wird der Default Constructor der Klasse <code>wrapper</code> aufgerufen, der Pointer auf <code>nullptr</code> initialisiert, und wenn ich schlussendlich in der main-Funktion begin() / end() aufrufe gibts halt deswegen einen Segfault.</p>
<p>Und imho liegt es an der virtuellen Vererbung, wobei ich da leider nicht drum herum komme.</p>
<p>Wenn ich statt <code>virtual public wrapper&lt;Type&gt;</code> einfach nur <code>public wrapper&lt;Type&gt;</code> vererbe, gibt es keine Probleme - bis dann irgendwann bei meinen anderen wrapper-Klassen das Diamond-Problem entsteht.</p>
<p>Meine Frage: Warum wird <strong>trotz</strong> explizitem Aufruf eines Konstruktors dennoch der Default Ctor genommen?</p>
<p>Ein Workaround wäre beispielsweise so:</p>
<pre><code class="language-cpp">iterator_wrapper(Type&amp; type) : wrapper&lt;Type&gt;(type) /* hier wird aus unbekanntem Grund dennoch der Default Ctor aufgerufen */ {
    wrapper&lt;Type&gt;::ptr = std::addressof(type); // mit dieser Zeile Code scheint es nun endgültig zu funktionieren.
}
</code></pre>
<p>Aber dennoch würde ich gern wissen warum hier ein Default Ctor aufgerufen wird, und das Ganze auch ohne Workaround lösen.<br />
Irgendwas muss ich doch falsch gemacht haben, oder?</p>
<p>Kompiliert mit G++ 4.8.</p>
<p>Hoffe auf Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316295/virtual-inheritance-default-ctor-wird-aufgerufen-explizit-wird-jedoch-ein-anderer-aufgerufen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 04:54:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316295.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Apr 2013 15:46:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 15:46:53 GMT]]></title><description><![CDATA[<p>Hallo liebe Community,</p>
<p>also angenommen ich habe eine abstrakte Klasse namens wrapper, die wie folgt implementiert ist:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class wrapper{
protected:
    Type* ptr;

public:
    // constructors
    wrapper() : ptr(nullptr) {}
    wrapper(Type&amp; type) : ptr(std::addressof(type)) {}

    virtual ~wrapper() = 0;
};

template&lt;typename Type&gt;
wrapper&lt;Type&gt;::~wrapper() {}
</code></pre>
<p>Nun implementiere ich eine weitere abstrakte Klasse namens iterator_wrapper, die aufgrund einer Vererbungsorgie virtuell von der wrapper-Klasse erbt:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class iterator_wrapper : virtual public wrapper&lt;Type&gt;{

public:
    iterator_wrapper() = default;
    iterator_wrapper(Type&amp; type) : wrapper&lt;Type&gt;(type) {}

    typedef typename Type::iterator iterator;

    virtual ~iterator_wrapper() = 0;

    iterator begin() const { return wrapper&lt;Type&gt;::ptr-&gt;begin(); }
    iterator end()   const { return wrapper&lt;Type&gt;::ptr-&gt;end(); }
};

template&lt;typename Type&gt;
iterator_wrapper&lt;Type&gt;::~iterator_wrapper() {}
</code></pre>
<p>Und nun die Klasse im Einsatz. Dazu schreib ich mir eine Test-Klasse namens &quot;Example&quot; und teste somit ob die iterator_wrapper-Klasse funktioniert.</p>
<pre><code class="language-cpp">/*** Hier die abstrakten Klassen ***/

class Example : public iterator_wrapper&lt;std::vector&lt;int&gt;&gt;{
    std::vector&lt;int&gt; vec;

public:
    Example() : iterator_wrapper&lt;decltype(vec)&gt;(vec){
        vec = {1, 2, 3, 4, 5};
    }
};

int main(){
    for(const auto&amp; xyz : Example()); // SEGFAULT
    return 0;
}
</code></pre>
<p>Das Segfault entsteht, weil aus irgend einem unbekannten Grund dennoch der Default Constructor der Klasse <code>wrapper</code> aufgerufen wird. Beachtet, dass ich in den Initialisierungslisten jedoch diesen nicht aufrufe!</p>
<p><code>Example::Example()</code> ruft <code>iterator_wrapper&lt;Type&gt;::iterator_wrapper(Type&amp;)</code> auf.<br />
<code>iterator_wrapper&lt;Type&gt;::iterator_wrapper(Type&amp;)</code> <strong>sollte</strong> <code>wrapper&lt;Type&gt;::wrapper(Type&amp;)</code> aufrufen.</p>
<p>Stattdessen wird der Default Constructor der Klasse <code>wrapper</code> aufgerufen, der Pointer auf <code>nullptr</code> initialisiert, und wenn ich schlussendlich in der main-Funktion begin() / end() aufrufe gibts halt deswegen einen Segfault.</p>
<p>Und imho liegt es an der virtuellen Vererbung, wobei ich da leider nicht drum herum komme.</p>
<p>Wenn ich statt <code>virtual public wrapper&lt;Type&gt;</code> einfach nur <code>public wrapper&lt;Type&gt;</code> vererbe, gibt es keine Probleme - bis dann irgendwann bei meinen anderen wrapper-Klassen das Diamond-Problem entsteht.</p>
<p>Meine Frage: Warum wird <strong>trotz</strong> explizitem Aufruf eines Konstruktors dennoch der Default Ctor genommen?</p>
<p>Ein Workaround wäre beispielsweise so:</p>
<pre><code class="language-cpp">iterator_wrapper(Type&amp; type) : wrapper&lt;Type&gt;(type) /* hier wird aus unbekanntem Grund dennoch der Default Ctor aufgerufen */ {
    wrapper&lt;Type&gt;::ptr = std::addressof(type); // mit dieser Zeile Code scheint es nun endgültig zu funktionieren.
}
</code></pre>
<p>Aber dennoch würde ich gern wissen warum hier ein Default Ctor aufgerufen wird, und das Ganze auch ohne Workaround lösen.<br />
Irgendwas muss ich doch falsch gemacht haben, oder?</p>
<p>Kompiliert mit G++ 4.8.</p>
<p>Hoffe auf Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319358</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 15:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 16:02:45 GMT]]></title><description><![CDATA[<p>Virtuelle Basisklassen werden stets direkt vom Konstruktor der am weitesten abgeleiteten Klasse (also derjeneigen, von der ein vollständiges Objekt erzeugt wird) aus initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319363</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 28 Apr 2013 16:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 16:13:04 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Virtuelle Basisklassen werden stets direkt vom Konstruktor der am weitesten abgeleiteten Klasse (also derjeneigen, von der ein vollständiges Objekt erzeugt wird) aus initialisiert.</p>
</blockquote>
<p>Wow, Danke! <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="😃"
    /></p>
<p>Somit:</p>
<pre><code class="language-cpp">class Example : public iterator_wrapper&lt;std::vector&lt;int&gt;&gt;{
    std::vector&lt;int&gt; vec;

public:
    Example() : wrapper&lt;decltype(vec)&gt;(vec){
        vec = {1, 2, 3, 4, 5};
    }
};
</code></pre>
<p>klappt es nun schlussendlich.<br />
Cool.</p>
<p>Was die Grundlagen angehen hab ich wohl noch ein bisschen Nachholbedarf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319369</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 16:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 16:45:54 GMT]]></title><description><![CDATA[<p>Ich bin mir sicher, dass es einen Weg um die virtuell Vererbung rum gibt.<br />
Ausserdem wäre ich vorsichtig, ob das was du da tust überhaupt funktioniert.</p>
<p>vec ist zu dem Zitpunkt noch nicht konstruiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319395</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 28 Apr 2013 16:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 16:46:04 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Ich bin mir sicher, dass es einen Weg um die virtuell Vererbung rum gibt.</p>
</blockquote>
<p>Ja, den gibt es auch, Codeduplikation mag ich aber nicht <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/2319398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319398</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 16:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 16:47:08 GMT]]></title><description><![CDATA[<blockquote>
<p>vec ist zu dem Zitpunkt noch nicht konstruiert.</p>
</blockquote>
<p>Ist doch egal, oder?<br />
Schließlich kopiere ich ihn ja nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319400</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 16:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 17:43:24 GMT]]></title><description><![CDATA[<p>Pobacke schrieb:</p>
<blockquote>
<blockquote>
<p>vec ist zu dem Zitpunkt noch nicht konstruiert.</p>
</blockquote>
<p>Ist doch egal, oder?<br />
Schließlich kopiere ich ihn ja nicht.</p>
</blockquote>
<p>Wieso ist das wichtig? Macht doch keinen Unterschied. Etwas nicht-konstruiertes kann auch keine Adresse haben.</p>
<p>Pobacke schrieb:</p>
<blockquote>
<pre><code class="language-cpp">wrapper(Type&amp; type) : ptr(std::addressof(type)) {}
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2319434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319434</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 28 Apr 2013 17:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 17:53:33 GMT]]></title><description><![CDATA[<p>@out,</p>
<p>Bist Du Dir da auch wirklich <a href="http://ideone.com/370YEW" rel="nofollow">sicher</a>?<br />
Ich will ja nicht das Gegenteil behaupten, aber die Ausgabe sagt da irgendwie was anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319438</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 17:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 18:35:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Etwas nicht-konstruiertes kann auch keine Adresse haben.</p>
</blockquote>
<p>Blödsinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Edit: Beziehst du dich auf den Standard? Da bin ich mir nicht sicher, da müsste man mal gucken wie das definiert ist. Vielleicht ist es wirklich UB die Adresse eines noch nicht initialisierten non-POD Objektes zu nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319457</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 28 Apr 2013 18:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 18:48:33 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Etwas nicht-konstruiertes kann auch keine Adresse haben.</p>
</blockquote>
<p>Blödsinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Sonen Blödsinn Sone.</p>
<p>[class.cdtor]/1 schrieb:</p>
<blockquote>
<p>For an object with a non-trivial constructor, referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior.</p>
</blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Vielleicht ist es wirklich UB die Adresse eines noch nicht initialisierten non-POD Objektes zu nehmen.</p>
</blockquote>
<p>Sonen Blödsinn Sone, das ist erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319466</guid><dc:creator><![CDATA[bullshit]]></dc:creator><pubDate>Sun, 28 Apr 2013 18:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 18:50:44 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Etwas nicht-konstruiertes kann auch keine Adresse haben.</p>
</blockquote>
<p>Blödsinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Ich zumindest, finde es doch sehr unlogisch, dass etwas bereits eine Adresse hat, obwohl es nocht nicht definiert wurde. Du nicht? Ich finde aber gerade auch nicht wirklich etwas dazu... Wenn aber Speicher für Member allkoiert wird, bevor der Ctor seine Arbeit antritt... komisch... man sagt doch immer Speicherreservierung geschieht bei der Definition eines Objekt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319467</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 28 Apr 2013 18:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:17:58 GMT]]></title><description><![CDATA[<p>bullshit schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Etwas nicht-konstruiertes kann auch keine Adresse haben.</p>
</blockquote>
<p>Blödsinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Sonen Blödsinn Sone.</p>
<p>[class.cdtor]/1 schrieb:</p>
<blockquote>
<p>For an object with a non-trivial constructor, referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior.</p>
</blockquote>
</blockquote>
<p>Es ging hier nicht darum, ob es UB ist vor der Ausführung des Konstruktors auf die Member eines Objektes zuzugreifen, sondern um die schlichte Aussage</p>
<blockquote>
<p>Etwas nicht-konstruiertes kann auch keine Adresse haben.</p>
</blockquote>
<p>, die natürlich sofort widerlegt ist, anhand dem Beispiel das Pobacke gebracht hat. Daher: Doch nicht sonen Blödsinn.</p>
<p>Etwas nicht konstruiertes <strong>muss</strong> aber schon allein deswegen eine Adresse haben, weil vor der Initialisierung eines Objektes durch den Konstruktor dafür Speicher angefordert wird. Die Adresse des ersten Bytes das von dem Objekt im Speicher belegt wird steht also klar, und das ist, weil [intro.object]/6 die Adresse eines Objektes entsprechend definiert, auch die Adresse unseres Objektes.</p>
<p>bullshit schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Vielleicht ist es wirklich UB die Adresse eines noch nicht initialisierten non-POD Objektes zu nehmen.</p>
</blockquote>
<p>Sonen Blödsinn Sone, das ist erlaubt.</p>
</blockquote>
<p>Gut, das ist natürlich erlaubt, da hab ich mich vertan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319474</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:24:13 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Etwas nicht konstruiertes <strong>muss</strong> aber schon allein deswegen eine Adresse haben, weil vor der Initialisierung eines Objektes durch den Konstruktor dafür Speicher angefordert wird. Die Adresse des ersten Bytes das von dem Objekt im Speicher belegt wird steht also klar, und das ist, weil [intro.object]/6 die Adresse eines Objektes entsprechend definiert, auch die Adresse unseres Objektes.</p>
</blockquote>
<p>Etwas nicht Konstruiertes muss nicht immer eine Adresse haben. Du hast aber recht, es gibt Spezialfälle in denen das so ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319479</guid><dc:creator><![CDATA[bullshit]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:24:13 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:33:09 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Etwas nicht konstruiertes <strong>muss</strong> aber schon allein deswegen eine Adresse haben, weil vor der Initialisierung eines Objektes durch den Konstruktor dafür Speicher angefordert wird.</p>
</blockquote>
<p>Hast du mir die Stelle im Draft? Ich finds net <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319482</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:37:49 GMT]]></title><description><![CDATA[<blockquote>
<p>Etwas nicht Konstruiertes muss nicht immer eine Adresse haben.</p>
</blockquote>
<p>Damit implizierst du, dass der Konstruktor dann für das Objekt selbst Speicher anfordert.<br />
Oder könnte es sein, dass zwar Speicher reserviert ist, aber die Adresse noch nicht feststeht?</p>
<p>Merke: Es geht nicht darum, ob man die Adresse irgendwie im Programm bestimmen und in eine Variable stopfen kann. Es geht lediglich darum, ob die Adresse feststeht, sprich: ob man als Allwissender mit 99%iger* Wahrscheinlichkeit voraussagen kann, Objekt a wird die Adresse x haben.</p>
<p>out schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Etwas nicht konstruiertes <strong>muss</strong> aber schon allein deswegen eine Adresse haben, weil vor der Initialisierung eines Objektes durch den Konstruktor dafür Speicher angefordert wird.</p>
</blockquote>
<p>Hast du mir die Stelle im Draft? Ich finds net <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
</blockquote>
<p>Hmm. Warten wir bis camper kommt.</p>
<p>*Vielleicht gibt es ja auch einen Stromausfall, kurz bevor der Ctor aufgerufen wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319484</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:37:49 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:47:52 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Etwas nicht Konstruiertes muss nicht immer eine Adresse haben.</p>
</blockquote>
<p>Damit implizierst du, dass der Konstruktor dann für das Objekt selbst Speicher anfordert.<br />
Oder könnte es sein, dass zwar Speicher reserviert ist, aber die Adresse noch nicht feststeht?</p>
<p>Merke: Es geht nicht darum, ob man die Adresse irgendwie im Programm bestimmen und in eine Variable stopfen kann. Es geht lediglich darum, ob die Adresse feststeht, sprich: ob man als Allwissender mit 99%iger* Wahrscheinlichkeit voraussagen kann, Objekt a wird die Adresse x haben.</p>
</blockquote>
<p>Hast du überhaupt das von mir zitierte [clas.cdtor] genauer angeschaut? Da steht genau das.</p>
<p>Eine etwas leichtere Kost ist das Example dazu:</p>
<p>[clas.cdtor] schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct W { int j; };
struct X : public virtual W { };
struct Y {
  int *p;
  X x;
  Y() : p(&amp;x.j) {    // undefined, x is not yet constructed
    }
};
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2319486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319486</guid><dc:creator><![CDATA[bullshit]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:49:20 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Etwas nicht konstruiertes <strong>muss</strong> aber schon allein deswegen eine Adresse haben, weil vor der Initialisierung eines Objektes durch den Konstruktor dafür Speicher angefordert wird.</p>
</blockquote>
<p>Ok, habe nun endlich ein paar Stellen im Netz gefunden, die dich bestätigen. :p</p>
<p><a href="http://yosefk.com/c++fqa/ctors.html" rel="nofollow">http://yosefk.com/c++fqa/ctors.html</a></p>
<blockquote>
<p>That's right - constructors initialize objects. In particular, constructors don't allocate the chunk of memory used for storing the object.</p>
</blockquote>
<p><a href="http://stackoverflow.com/questions/3617465/how-are-constructors-and-destructors-implemented-in-c" rel="nofollow">http://stackoverflow.com/questions/3617465/how-are-constructors-and-destructors-implemented-in-c</a></p>
<blockquote>
<p>The constructor is called with this already pointing to the allocated memory; it need just fill in the members at that location.</p>
</blockquote>
<p>Jetzt fehlt nur noch die Stelle im Draft <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319487</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:52:31 GMT]]></title><description><![CDATA[<blockquote>
<p>Hast du überhaupt das von mir zitierte [clas.cdtor] genauer angeschaut?</p>
</blockquote>
<p>Ja. Was soll da stehen? Wann der Speicher für ein Objekt angefordert wird? Wohl kaum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319488</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 19:55:01 GMT]]></title><description><![CDATA[<p>bullshit schrieb:</p>
<blockquote>
<p>Eine etwas leichtere Kost ist das Example dazu:</p>
<pre><code class="language-cpp">struct W { int j; };
struct X : public virtual W { };
struct Y {
  int *p;
  X x;
  Y() : p(&amp;x.j) {    // undefined, x is not yet constructed
    }
};
</code></pre>
</blockquote>
<p>Joa, das ist UB. Das haben wir nun geklärt.</p>
<p>Die aktuelle Frage ist gerade, wann wird der Speicher für eine Instanz angefordert und von wem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319489</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 28 Apr 2013 19:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Thu, 12 Jun 2014 02:13:24 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319493</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 12 Jun 2014 02:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 20:33:44 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Ich bin mir sicher, dass es einen Weg um die virtuell Vererbung rum gibt.<br />
Ausserdem wäre ich vorsichtig, ob das was du da tust überhaupt funktioniert.</p>
<p>vec ist zu dem Zitpunkt noch nicht konstruiert.</p>
</blockquote>
<p>Das ist kein Problem.<br />
Es wird ja nur ein lvalue (this-&gt;vec) gebildet, das auf zwar uninitialisierten aber reservierten (3.7.5) Speicher verweist. Die Konstruktion von Example hat begonnen, also kann ein Verweis auf sein Member vec gebildet werden. Und die weitere Verwendung dieses lvalues ist hier unproblematisch (3.8/5, 3.8/6).</p>
<p>Vom Rest der Diskussion kriege ich bloss Kopfschmerzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319495</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 28 Apr 2013 20:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 20:35:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Well?</p>
</blockquote>
<p>Zu viel A Clockwork Orange geguckt?</p>
<p>Swordfish schrieb:</p>
<blockquote>
<p>Komische Frage. Wann wird Speicher für</p>
<pre><code>int i;
</code></pre>
<p>reserviert? Bei der Deklaration von <code>i</code> durch Bewegen des Stackpointers.</p>
<p>Wieso sollt es für Klasseninstanzen anders sein?</p>
</blockquote>
<p>Für <strong>Stackobjekte</strong> ist es sicherlich so.<br />
Btw: Wird der Stackpointer nicht bei der <em>Definition</em> erhöht/erniedrigt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319497</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 28 Apr 2013 20:35:42 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Thu, 12 Jun 2014 02:13:28 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319499</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 12 Jun 2014 02:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 21:41:18 GMT]]></title><description><![CDATA[<p>Auf jeden Fall: Dankeschön! <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319522</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 21:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 21:51:06 GMT]]></title><description><![CDATA[<blockquote>
<p>Nö, kenn den Film nicht.</p>
</blockquote>
<p>Naja. Dieser Anglizismus ist jedenfalls erschreckend. <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>
<blockquote>
<p>bar liegt am Heap, new besorgt Speicher, danach def-ctor</p>
</blockquote>
<p>Genau.</p>
<blockquote>
<p>Der Stackrahmen wird bei Funktionseintritt eingerichtet.</p>
</blockquote>
<p>Was meinst du mit &quot;eingerichtet&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319524</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 28 Apr 2013 21:51:06 GMT</pubDate></item><item><title><![CDATA[Reply to virtual inheritance - Default Ctor wird aufgerufen, explizit wird jedoch ein anderer aufgerufen on Sun, 28 Apr 2013 21:56:10 GMT]]></title><description><![CDATA[<p>Ich werde dann halt dennoch eine entsprechende set()-Funktion bauen, falls doch irgendwann einmal ein Objekt das nicht auf dem Stack liegt gewrapped werden muss.<br />
Man weiß ja nie <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/2319526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319526</guid><dc:creator><![CDATA[Pobacke]]></dc:creator><pubDate>Sun, 28 Apr 2013 21:56:10 GMT</pubDate></item></channel></rss>