Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat von »"Gotbread"«
der compiler denkt, dass er ein zeiger auf base bekommt. a hat in der
klasse den offset 0. in der abgeleiteten klasse kann es genauso sein,
aber es scheint als ob es bei dir genau anders herum ist (erst derived, dann
base).
Zitat von »"Nexus"«
Das ist falsch. Wenn man Member über den Bezeichner anspricht, hat man sicher nie Probleme wegen Vererbung. Es wäre ja witzlos, wenn man in abgeleiteten Klassen zuerst implementierungsabhängige Mittel einsetzen müsste, um an Member der Basisklasse zu gelangen... :roll:Zitat von »"Gotbread"«
das kann ich dir sagen.
der compiler denkt, dass er ein zeiger auf base bekommt. a hat in der
klasse den offset 0. in der abgeleiteten klasse kann es genauso sein,
aber es scheint als ob es bei dir genau anders herum ist (erst derived, dann
base).
Zitat von »"Nexus"«
Ein Einsatzbeispiel würde mich jetzt wirklich interessieren...Zitat von »"Gotbread"«
wär doch ne idee für C++0x: virtuelle daten
Zitat von »"Nexus"«
Nicht wirklich. Die Member sind innerhalb einer einzelnen Klasse in der Reihenfolge abgespeichert, in der sie deklariert wurden (möglicherweise noch ausgerichtet).
Zitat von »"Nexus"«
Wenn dem so wäre dann müsste der Compiler sich drum kümmern indem er bei dem impliziten upcast von Derived* nach Base* den Zeiger verschiebt. Kann also nicht das Problem sein
Zitat von »"Gotbread"«
muss nicht. das bei einer abgeleiteten klasse die daten der baseclass
zuerst stehen, ist zwar einfach zu implementieren, deshalb wahrschein-
lich auch von einigen compilern genutzt, aber zwingend ist das nicht.
wenn der compiler die basezeiger um dieses offset verschiebt, für
den benutzer hinter einem implizitem cast verborgen, ist es nicht
auszuschließen, dass das ganze z.b. mit reinterpret fehlschlägt.
Zitat von »"Gotbread"«
damit man dieses problem umgehen kann. damit man auch ne vtbl für
daten hat. war nur ne idee die mir spontan kam habs nicht ausüberlegt.
Zitat von »"Gotbread"«
Zitat von »"dot"«
Wenn dem so wäre dann müsste der Compiler sich drum kümmern indem er bei dem impliziten upcast von Derived* nach Base* den Zeiger verschiebt. Kann also nicht das Problem sein
dem schließe ich mich an, allerdings sagt das nichts über die position aus.
(ok mein erster beitrag stimmt damit nicht ganz)
C-/C++-Quelltext |
|
1 |
std::cout << param[0].a; |
Ich sagte, wenn man Member über den Bezeichner anspricht. Dass man mit reinterpret_cast die Möglichkeit hat, nahezu alle Gesetze zu umgehen, ändert nichts daran.Zitat von »"Gotbread"«
muss nicht. das bei einer abgeleiteten klasse die daten der baseclass
zuerst stehen, ist zwar einfach zu implementieren, deshalb wahrschein-
lich auch von einigen compilern genutzt, aber zwingend ist das nicht.
wenn der compiler die basezeiger um dieses offset verschiebt, für
den benutzer hinter einem implizitem cast verborgen, ist es nicht
auszuschließen, dass das ganze z.b. mit reinterpret fehlschlägt.
Ich meinte nur, meistens wären "virtuelle Daten" auch durch virtuelle Funktionen möglich, die Daten zurückgeben. Deshalb würde mich ein Fall, wo das nicht geht, interessieren...Zitat von »"Gotbread"«
damit man dieses problem umgehen kann. damit man auch ne vtbl für
daten hat. war nur ne idee die mir spontan kam habs nicht ausüberlegt.
Hm, das mit der Speicherreihenfolge scheint gerade nur für die Structs aus C zu gelten. Das erklärt auch, weshalb das Makro offsetof() nur auf POD-Typen angewandt werden kann. Aus dem C++-Standard:Zitat von »"Gotbread"«
kannst du mir das im standard zeigen? ich meine auch, dass es nicht
vorgeschrieben ist. natürlich machen 99.352% aller compiler das so,
aber gesetz ist es vermutlich (da keine beweise) nicht. und in welcher
reihenfolge steht die basisklasse?
Zitat von »"9.2/12"«
Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of nonstatic data members separated by an access-specifier is unspecified (11.1). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1)
Ein Indiz? Er sagt ja selber, bei sich habe es anschliessend auch funktioniert. Er hat das ursprüngliche Problem nicht richtig abstrahiert...Zitat von »"Gotbread"«
allerdings ist das problem des TE ein indiz dafür, das da was nicht tut
wie es tun soll.
Zitat
Was für einen Compiler verwendest du?
Zitat
aber sobald du param[1].a schreibst (was du vermutlich bei dir tust), wird nur Mist gebaut
Zitat
Als Workaround könntest du der Methode als zusätzlichen Parameter die Größe eines Arrayelementes geben.
Bei Helmuts Vorschlag, die Größe eines Elements mitzuschicken. Mir ist wie gesagt klar, was da das Problem ist, und weshalb man darum die Größe mitschicken kann, aber nicht, wie ich dann weitermach, wenn ich die Größe hab.Zitat
defaultplayer, wo kommst du denn nicht mehr weiter?
Werbeanzeige