Instanz einer Basisklasse erkennen in C++
-
blurry333 schrieb:
Sobald ich in der Basisklasse einen virtuellen Destruktor hinzufuege, ist die Klasse nicht mehr 1 Byte sondern 4 Byte gross. Warum das ?
Kann man nicht mit letzter Sicherheit sagen weil das im Standard nicht festgelegt ist und von der Implemetierung abhängt.
Wahrscheinlich wird in deinem Objekt zusätzlich ein Pointer auf die vTable gespeichert.
blurry333 schrieb:
Und vorallem die abgeleiteten klassen sind auch 4 Byte gross , aber der Destruktor wird doch nicht mitvererbt oder ?
Die Anzahl Methoden einer Klasse hat keinen Einfluss auf die Grösse eines Objekts.
-
Kann man nicht mit letzter Sicherheit sagen weil das im Standard nicht festgelegt ist und von der Implemetierung abhängt.
du meinst von der Implementierung des Compilers oder
-
Ja, irgendeine virtuelle Methode. Ein Destruktor ist harmlos, deswegen hab ich den vorgeschlagen.
Eine leere Klasse ist 1 Byte groß. Es steht zumindest im Standard, dass es keine Objekte mit der Größe 0 geben kann, ob eine leere Klasse laut Standard auch 2 Byte groß sein kann, weiß ich nicht. So bald du eine virtuelle Funktion hast, auch den Destruktor, dann gibts eine vftbl und das ist ein Zeiger in der Instanz. Aber blurry weiß eh alles, er trollt nur.
-
#include <iostream> using namespace std; class Auto{ public : virtual ~Auto() { cout<<"Basis Destruktor aufgerufen"<<endl; } }; class Audi : public Auto { public: virtual ~Audi() { cout<<"Audi Destruktor aufgerufen"<<endl; } }; void funk(Auto param) { } int main() { funk( Audi()); }
Ausgabe:
Destruktor Basis
Destuktor Audi
Destruktor BasisWarum wird 2 mal Basis aufgerufen und warum ueberhaupt Basis wenn Destruktor virtuell ist ?
-
Steht alles in einem guten C++ Grundlagenbuch.
-
da hab ich jetzt kein Nerv dazu Aus meiner Sicht sollte nur einmal der Audi Destruktor aufgerufen werden.
-
Warum?
-
blurry333 schrieb:
da hab ich jetzt kein Nerv dazu Aus meiner Sicht sollte nur einmal der Audi Destruktor aufgerufen werden.
Du kopierst aber das Objekt.
-
Nathan schrieb:
Du kopierst aber das Objekt.
Daran liegt es nicht.
-
icarus2 schrieb:
Nathan schrieb:
Du kopierst aber das Objekt.
Daran liegt es nicht.
Oh, ich dachte es hapert daran, wiesos zweimal aufgerufen wird, nicht wieso überhaupt...