Mehrfachvererbung in C++
-
Tach!
Ich bilde mich momentan im Bereich Mehrfache Vererbung weiter. Dabei begreife ich noch nicht alles.
Das Vererbungsverhältnis des Codes als Diagramm:
Klasse1 ^ ^ / \ / \ Klasse2 Klasse3 ^ ^ \ / \ / Klasse4#include <iostream> struct Klasse1 { int kl1; Klasse1(int nr):kl1(nr){ } }; class Klasse2 : virtual public Klasse1 { int kl2; public: Klasse2(int nr):Klasse1(5),kl2(nr){ } }; class Klasse3 : virtual public Klasse1 { int kl3;public: Klasse3(int nr):Klasse1(5),kl3(nr){ } }; class Klasse4 : public Klasse2, public Klasse3 { int kl4;public: Klasse4():Klasse1(1),Klasse2(2),Klasse3(3){ } }; int main(){ std::cout << "Grösse Klasse1: " << sizeof(Klasse1) << std::endl; std::cout << "Grösse Klasse2: " << sizeof(Klasse2)<< std::endl; std::cout << "Grösse Klasse4: " << sizeof(Klasse4)<< std::endl; }Ausgabe:
Grösse Klasse1: 4
Grösse Klasse2: 12
Grösse Klasse4: 24Weshalb ist sizeof(Klasse2) = 12 und sizeof(Klasse4) = 24 ?
Danke für eure Hilfe.
Simon.
-
So ist der Quellcode übersichtlicher.
Liebe Grüsse
Simon.#include <iostream> struct Klasse1 { int kl1; Klasse1(int nr):kl1(nr){} }; class Klasse2 : virtual public Klasse1 { int kl2; public: Klasse2(int nr):Klasse1(5),kl2(nr){} }; class Klasse3 : virtual public Klasse1 { int kl3; public: Klasse3(int nr):Klasse1(5),kl3(nr){} }; class Klasse4 : public Klasse2, public Klasse3 { int kl4; public: Klasse4():Klasse1(1),Klasse2(2),Klasse3(3){} }; int main(){ std::cout << "Grösse Klasse1: " << sizeof(Klasse1) << std::endl; std::cout << "Grösse Klasse2: " << sizeof(Klasse2)<< std::endl; std::cout << "Grösse Klasse4: " << sizeof(Klasse4)<< std::endl; }
-
virtual sorgt dafür, dass die Klasse sich die Vererbung merkt. Ich nehme an, dass das virtual der Klasse also noch einen Pointer gibt der Größe 4 Bytes.
Klasse2 hat also 4 Byte vom int, 4 Byte vom int der Basisklasse + 4 Byte von dem von virtual angelegtem Pointer.
Klasse 4 hat 4 Bytes von den ints von Klasse 1, 2 und 3, selbst ein int mit 4 Bytes und scheinbar zwei Pointer, wegen 2 Basisklassen.edit:
richtig, der Standard schreibt hier gar nix vor. Und es können bei Klassen noch viele andere Faktoren reinspielen, aber für diesen Fall, denke ich dürfte es das sein.
-
Ich glaube, dazu kann man keine allgemeine Aussage treffen. Das ist doch sehr implementierungsabhängig.
Wandle die Member vom Typ int in char um und teste mit verschiedenen Compilern, dann fällt sofort auf, dass man die Rechnung nicht so einfach machen kann.
-
Danke für die Auflösung.
Liebe Grüsse
Simon.