Klassenobjekte.
-
Start main()
A::Standardkonstruktor
C::Standardkonstruktor
B::Standardkonstruktor
B::Destruktor
C::Destruktor
A::Destruktor
Ende main()
Press any key to continueDas kommt als Ausgabe wenn man nur b_obj ausgibt. Warum wird hier der Konstruktor von C früher als der Konstruktor von B aufgerufen?
-
Also ich habe für das virtual so ein Beispiel gefunden:
#include <iostream> using namespace std; class Base1 { public: ~Base1() { cout << "~Base1()\n"; } }; class Derived1 : public Base1 { public: ~Derived1() { cout << "~Derived1()\n"; } }; class Base2 { public: virtual ~Base2() { cout << "~Base2()\n"; } }; class Derived2 : public Base2 { public: ~Derived2() { cout << "~Derived2()\n"; } }; int main() { Base1* bp = new Derived1; // Upcast delete bp; Base2* b2p = new Derived2; // Upcast delete b2p; return 0; }Also wäre hier b2p richtig gelöscht aber bp wurde halt nicht alles löschen?
Oder
-
Delikanli schrieb:
Warum wird hier der Konstruktor von C früher als der Konstruktor von B aufgerufen?
Weil Member vor dem Objekt selbst erzeugt werden.
Delikanli schrieb:
Also wäre hier b2p richtig gelöscht aber bp wurde halt nicht alles löschen?
Richtig. Die Meldung "~Derived1()\n" dürfte nicht erscheinen.
-
Also d.h. dass die Klasse B sein Konstruktor zum schluss aufruft. Woher weisst der Compiler das? Egal auf jeden ist das so oder?
Und noch was: Was ist ein statisches Element.
-
Und noch was: Was ist ein statisches Element.Ein statisches Element existiert nur einmal pro Klasse, ist also klassenspezifisch, und nicht wie normale Instanzvariablen der Klasse instanzspezifisch. D.h. alle Instanzen der Klasse teilen sich ein und dasselbe Element.
-
#include <iostream> using namespace std; class C { public: C() { cout << "C::Standardkonstruktor" << endl; } ~C() { cout << "C::Destruktor" << endl; } }; class A { public: A() { cout << "A::Standardkonstruktor" << endl; } ~A() { cout << "A::Destruktor" << endl; } }; class B : public A { public: B(): A(){ cout << "B::Standardkonstruktor" << endl; } ~B() { cout << "B::Destruktor" << endl; } private: static C c_obj2; //<<<<<================<<<<<============ }; void main(void) { cout << endl; cout << "Start main()" << endl; //A a_obj; {B b_obj;} //C c_obj; cout << "Ende main()" << endl; }<<<<========<<<<===== Also wenn ich C c_obj2; als statisches Element deklariere
wird der Konstruktor von C nicht mehr aufgerufen. Warum?
-
Du hast c_obj2 gar nicht definiert. Würdest du darauf zugreifen, würde sich der Linker beschweren.
In deinem Code fehlt
C B::c_obj2;
-
Delikanli schrieb:
<<<<========<<<<===== Also wenn ich C c_obj2; als statisches Element deklariere
wird der Konstruktor von C nicht mehr aufgerufen. Warum?Das kommt daher weil du B::c_obj2 nur declariert aber nicht implementiert hast. Wenn du B::c_obj2 irgendwo verwenden würdest gäbe es einen Linker-Fehler.
Richtig wäreC B::c_obj2; // implementieren int main(void) { cout << endl; cout << "Start main()" << endl; //A a_obj; {B b_obj;} //C c_obj; cout << "Ende main()" << endl; }BTW: umbedingt lesen ( bald weigere ich mich solchen code auszuprobieren )
http://www.research.att.com/~bs/bs_faq2.html#void-mainEDIT: scheinbar schlafe ich noch
-
Aber auf der Seite 1 wurde es mir so gezeigt!?
-
Also ich muss C B::c_obj2; einfügen weil C c_obj2; ein statisches Element wurde oder wie sieht es jetzt aus. Ich bin ganz durcheinander jetzt und verstehe gar nichts mehr.
-
Delikanli schrieb:
Also ich muss C B::c_obj2; einfügen weil C c_obj2; ein statisches Element wurde oder wie sieht es jetzt aus.
So ist es. Wenn in einer Klassendeklaration ein statisches Element steht, ist das erst mal nur eine Deklaration. Das Element muss auch noch irgendwo definiert werden.
-
Delikanli schrieb:
Aber auf der Seite 1 wurde es mir so gezeigt!?
Wenn du damit das void main() meinst. Das zeigt dir hier keiner.

-
Nein meine ich nicht. ich meine dass C c_obj2; ohne Definition!
-
Da wars nicht statisch.
-
Wieso kann ich den auf die Klasse C in der Klasse B zugreifen obwohl keine Vererbung besteht. Und das statische Element in unserem Fall habe ich immer noch nicht verstanden.
-
Delikanli schrieb:
Wieso kann ich den auf die Klasse C in der Klasse B zugreifen obwohl keine Vererbung besteht.
Wie kommst du darauf, dass dazu Vererbung notwendig wäre? Auf public-Elemente kann von überall zugegriffen werden.
Und das statische Element in unserem Fall habe ich immer noch nicht verstanden.
Was genau hast du nicht verstanden?
-
Und noch was. Wenn ich die Definition vor main einfüge bekomme ich bei so eine Ausgabe:
C::StandardkonstruktorStart main()
A::Standardkonstruktor
B::Standardkonstruktor
B::Destruktor
A::Destruktor
Ende main()
Press any key to continueDer Destruktor von C taucht nicht auf.
-
Statische Element: Man kann dieses Element in Main nicht mehr verändern. Oder?
Nur Außerhalb von main kann man ein statisches Element einer Klasse verändern.
Ich verstehe den Sinn nicht so ganz, warum mann statische Elemente verwendet. Gibt es auch statische Elemente im main?
-
Ich bitte dich inständig, lies dir das durch:
http://tutorial.schornboeck.net/oop.htm
http://tutorial.schornboeck.net/staticmember.htm
http://tutorial.schornboeck.net/vererbung.htm
http://tutorial.schornboeck.net/virtual.htm
-
Delikanli schrieb:
Statische Element: Man kann dieses Element in Main nicht mehr verändern. Oder?
Nein. "Statisch" bezieht sich auf die Lebensdauer, nicht auf die Veränderbarkeit. Für letzeres gibt es const.
Nur Außerhalb von main kann man ein statisches Element einer Klasse verändern.
Nein. Siehe oben.
Ansonsten kann ich GPC nur zustimmen. Alle deine Fragen werden in einem Tutorial beantwortet.