<?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[Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Klassenhierarchie</p>
<pre><code class="language-cpp">class B
{
public:
	virtual void check() { }
}

class D1 : public virtual B
{
public:
	virtual void check() { B::check(); }
}

class D2 : public virtual B
{
public:
	virtual void check() { B::check(); }
}

class DD : public D1, public D2
{
public:
	virtual void check() { D1::check(); D2::check(); }
}
</code></pre>
<p>wobei check() überprüfen soll, ob ein Objekt in einem legalen Zustand ist. Prolem ist nun, dass, wenn ich check() für ein Objekt der Klasse DD aufrufe, B::check() sowohl von D1::check() als auch D2::check() aufgerufen wird.</p>
<p>Weiss jemand, ob es eine Möglichkeit gibt, zur Kompilierzeit sicherzustellen, dass B::check() nur einmal aufgerufen wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224798/teilgraph-der-klassenhierarchie-zur-kompilierzeit-durchlaufen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 06:43:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224798.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Oct 2008 10:24:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 10:24:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Klassenhierarchie</p>
<pre><code class="language-cpp">class B
{
public:
	virtual void check() { }
}

class D1 : public virtual B
{
public:
	virtual void check() { B::check(); }
}

class D2 : public virtual B
{
public:
	virtual void check() { B::check(); }
}

class DD : public D1, public D2
{
public:
	virtual void check() { D1::check(); D2::check(); }
}
</code></pre>
<p>wobei check() überprüfen soll, ob ein Objekt in einem legalen Zustand ist. Prolem ist nun, dass, wenn ich check() für ein Objekt der Klasse DD aufrufe, B::check() sowohl von D1::check() als auch D2::check() aufgerufen wird.</p>
<p>Weiss jemand, ob es eine Möglichkeit gibt, zur Kompilierzeit sicherzustellen, dass B::check() nur einmal aufgerufen wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599239</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 15 Oct 2008 10:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 10:32:16 GMT]]></title><description><![CDATA[<p>Mal ganz davon abgesehen, dass ich das ganze Konstrukt sehr fragwürdig finde, solltest Du Dir mal virtuelle Vererbung ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599245</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 15 Oct 2008 10:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 10:47:05 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Mal ganz davon abgesehen, dass ich das ganze Konstrukt sehr fragwürdig finde, solltest Du Dir mal virtuelle Vererbung ansehen.</p>
</blockquote>
<p>- Könntest du etwas mehr dazu sagen, warum du das für sehr fragwürdig hälst?<br />
- Mir ist nicht klar, wie ich mit virtueller Vererbung mein Problem lösen kann. B ist ja schon virtuelle Basis von D1 und D2, von daher hat DD nur ein Objekt der Klasse B als Oberklasse. Das Problem ist aber ja, dass ich für dieses Objekt zweimal mittelbar check() aufrufe, wenn ich DD:check() benutze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599253</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 15 Oct 2008 10:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 11:07:42 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>- Könntest du etwas mehr dazu sagen, warum du das für sehr fragwürdig hälst?</p>
</blockquote>
<p>Was soll die Polymorphie? Du benutzt überall nur B::check(). Mir verschließt sich komplett, was Du damit erreichen willst. Vielleicht solltest Du das mal erklären.</p>
<p>ingobulla schrieb:</p>
<blockquote>
<p>Mir ist nicht klar, wie ich mit virtueller Vererbung mein Problem lösen kann. B ist ja schon virtuelle Basis von D1 und D2, von daher hat DD nur ein Objekt der Klasse B als Oberklasse. Das Problem ist aber ja, dass ich für dieses Objekt zweimal mittelbar check() aufrufe, wenn ich DD:check() benutze</p>
</blockquote>
<p>Das <code>virtual</code> habe ich irgendwie übersehen. Mal davon abgesehen: Wenn Du quallifiziert für D1 und D2 check() aufrufst, dann rufst Du es auch auf. <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="😉"
    /><br />
Hier:</p>
<pre><code class="language-cpp">virtual void check() { D1::check(); D2::check(); }
</code></pre>
<p>Du rufst von Hand D1::check() und D2::check() auf. Was erwartest Du da?</p>
<p>Ich denke mal, Du willst eher sowas:</p>
<pre><code class="language-cpp">class B
{
public:
    void check() {  }
};

class D1 : public virtual B
{
};

class D2 : public virtual B
{
};

class DD : public D1, public D2
{
} ;

//...
DD dd;
dd.check();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1599265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599265</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 15 Oct 2008 11:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 11:41:14 GMT]]></title><description><![CDATA[<p>Hier etwas ausführlicher: Sinn und Zweck des Ganzen ist, dieses Konstrukt zu benutzen, wenn B, D1, D2 und DD wirklich Daten enthalten. Sei also angenommen sie haben alle ein data member</p>
<pre><code class="language-cpp">int size;
</code></pre>
<p>und der müsse positiv sein, damit ein Objekt einer dieser Klassen in einem legalen Zustand ist.</p>
<pre><code class="language-cpp">class B 
{ 
private:
	int size;
public: 
    virtual void check() { if (size &lt;= 0) throw Error(&quot;B in illegal state&quot;); } 
} 

class D1 : public virtual B 
{ 
private:
	int size;
public: 
    virtual void check() { B::check(); if (size &lt;= 0) throw Error(&quot;D1 in illegal state&quot;); } 
} 

class D2 : public virtual B 
{ 
private:
	int size;
public: 
    virtual void check() { B::check(); if (size &lt;= 0) throw Error(&quot;D2 in illegal state&quot;); } 
} 

class DD : public D1, public D2 
{ 
private:
	int size;
public: 
    virtual void check() { D1::check(); D2::check(); if (size &lt;= 0) throw Error(&quot;DD in illegal state&quot;); } 
}
</code></pre>
<p>Mit check() soll man dann überprüfen können, ob ein jeweiliges Objekt in einem legalen Zustand ist. Für ein Objekt der Klasse DD müsste also überprüft werden, ob size &gt; 0 für DD, D1, D2 und B gilt (Konstruktoren, etc. habe ich hier weggelassen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599291</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 15 Oct 2008 11:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 11:51:54 GMT]]></title><description><![CDATA[<p>Wenns nur darum geht hier Ausführungs-Zeit spraen zu wollen würde ich sagen lass es einfach.<br />
So lange es kein echtes Problem verursacht (was es vermutlich nicht wird) ... zahlt es sich auch nicht aus das Problem zu lösen welches eben keines ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599297</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 15 Oct 2008 11:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to Teilgraph der Klassenhierarchie zur Kompilierzeit durchlaufen on Wed, 15 Oct 2008 12:12:18 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Ich würde die Zugriffe in den Settern / Kosntruktoren so gestalten, dass es gar keine invaliden Zustände geben kann. Dann muss hinterher auch nichts geprüft werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599310</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 15 Oct 2008 12:12:18 GMT</pubDate></item></channel></rss>