<?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[Datenelement in Basisklasse oder virtuelle Methode]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nehmen wir an, ich habe eine Basisklasse und alle davon abgeleiteten Klassen sollen eine TypID zurückgeben können.<br />
Ob das sinnvoll ist oder nicht - darüber kann man sich streiten, mir ist aber gerade kein besseres Beispiel eingefallen.</p>
<p>Was würdet ihr dann bevorzugen?</p>
<p>Gleicher Code:</p>
<pre><code class="language-cpp">namespace IDs
{
  enum Type
  {
     Derived1ID, Derived2ID, ...;
  };
}
</code></pre>
<p>1. Variante)</p>
<pre><code class="language-cpp">class Base
{
public:
  Base(int id):
  id_(id){}
  virtual ~Base(){}

  Ids::Type getID() const {return id_;}

private:
  int id_;
};

class Derived1 : public Base
{
public:
  Derived1():
  Base(IDs::Derived1ID){}
};
</code></pre>
<p>2. Variante)</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual ~Base(){}
  virtual IDs::Type getID() const = 0;
};

class Derived1 : public Base
{
public:
  virtual IDs::Type getID() const
  {return IDs::Derived1ID;}
};
</code></pre>
<p>Was auf die Schnelle auffällt:<br />
- Bei der zweiten Variante wird minimal Speicherplatz gespart<br />
- Bei der zweiten Variante können von Derived1 abgeleitete Klassen die ID weiter ändern<br />
- Bei der ersten Variante ist der Methodenaufruf nicht virtuell</p>
<p>Mir ist häufig die erste Variante in ähnlichen Situationen begegnet.</p>
<p>Was meint ihr - was ist besser und warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290373/datenelement-in-basisklasse-oder-virtuelle-methode</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 14:20:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290373.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Jul 2011 08:58:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datenelement in Basisklasse oder virtuelle Methode on Mon, 25 Jul 2011 09:01:32 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nehmen wir an, ich habe eine Basisklasse und alle davon abgeleiteten Klassen sollen eine TypID zurückgeben können.<br />
Ob das sinnvoll ist oder nicht - darüber kann man sich streiten, mir ist aber gerade kein besseres Beispiel eingefallen.</p>
<p>Was würdet ihr dann bevorzugen?</p>
<p>Gleicher Code:</p>
<pre><code class="language-cpp">namespace IDs
{
  enum Type
  {
     Derived1ID, Derived2ID, ...;
  };
}
</code></pre>
<p>1. Variante)</p>
<pre><code class="language-cpp">class Base
{
public:
  Base(int id):
  id_(id){}
  virtual ~Base(){}

  Ids::Type getID() const {return id_;}

private:
  int id_;
};

class Derived1 : public Base
{
public:
  Derived1():
  Base(IDs::Derived1ID){}
};
</code></pre>
<p>2. Variante)</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual ~Base(){}
  virtual IDs::Type getID() const = 0;
};

class Derived1 : public Base
{
public:
  virtual IDs::Type getID() const
  {return IDs::Derived1ID;}
};
</code></pre>
<p>Was auf die Schnelle auffällt:<br />
- Bei der zweiten Variante wird minimal Speicherplatz gespart<br />
- Bei der zweiten Variante können von Derived1 abgeleitete Klassen die ID weiter ändern<br />
- Bei der ersten Variante ist der Methodenaufruf nicht virtuell</p>
<p>Mir ist häufig die erste Variante in ähnlichen Situationen begegnet.</p>
<p>Was meint ihr - was ist besser und warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097495</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Mon, 25 Jul 2011 09:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Datenelement in Basisklasse oder virtuelle Methode on Mon, 25 Jul 2011 09:03:55 GMT]]></title><description><![CDATA[<p>Die erste ist in der Verwendung schneller. Aber wenn ich sowas brauche, mache ich entweder die zweite Variante und auf Speed kommt's nicht an, denn die zweite ist viel unärgerlicher wenns um mehrere Ebenen geht. Oder ich mache es compilerspezifisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097500</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Jul 2011 09:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to Datenelement in Basisklasse oder virtuelle Methode on Mon, 25 Jul 2011 12:27:47 GMT]]></title><description><![CDATA[<p>Ich denk, das bissi Geschmacks-Sache.</p>
<p>Bei Variante 1 konntest mehr mit den Zugriffsbeschraenkungen ueber die Construktoren machen.<br />
Base kann niemals allein erzeugt werden, der CTor mit der ID kann deshalb protected werden.<br />
Genau so koennt man Derived1 auch nen protected Ctor verpassen, den weitere Ableitungen dann benutzen sollten ...</p>
<p>Und wenn du oft in der Basis Zugriff auf Die ID brauchst, hasst du Member vs. vtable aufruf. Mit dem Member dürft er vielleicht kleinwenig schneller sein.</p>
<p>Und sicher das du sparst bei version 2 ?<br />
Du hasst einen eintrag mehr in der vtable ....</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097578</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Mon, 25 Jul 2011 12:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Datenelement in Basisklasse oder virtuelle Methode on Mon, 25 Jul 2011 17:21:36 GMT]]></title><description><![CDATA[<p>Die Vtable liegt doch nur einmal pro klasse im Speicher, die attribute aber einmal pro Objekt, also vom Speicher her denke ich, spart man wirklich, wird aber kaum relevant sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097720</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Mon, 25 Jul 2011 17:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to Datenelement in Basisklasse oder virtuelle Methode on Mon, 25 Jul 2011 17:26:10 GMT]]></title><description><![CDATA[<p>Q schrieb:</p>
<blockquote>
<p>Die Vtable liegt doch nur einmal pro klasse im Speicher, die attribute aber einmal pro Objekt, also vom Speicher her denke ich, spart man wirklich, wird aber kaum relevant sein.</p>
</blockquote>
<p>Aber dafür hat jedes Objekt hat einen Verweis auf den vtable als versteckten Member.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097723</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Jul 2011 17:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Datenelement in Basisklasse oder virtuelle Methode on Mon, 25 Jul 2011 18:15:04 GMT]]></title><description><![CDATA[<p>Das ist schon klar, aber den habe ich sowieso.<br />
Bei beiden Varianten hat die Basisklasse einen virtuellen Destruktor.</p>
<p>Und natürlich dauert es minimal länger eine virtuelle Methode aufzurufen, als eine normale, aber halt nur minimal.</p>
<p>Naja ich glaub inzwischen sind wir ein wenig abgeschweift, im Prinzip ist ja alles geklärt, scheint wohl keine wirklich bessere Variante zu geben, beide sind wohl ungefähr gleich gut (evtl. je nach situation).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097750</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Mon, 25 Jul 2011 18:15:04 GMT</pubDate></item></channel></rss>