Du bist nicht angemeldet.

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

1

29.01.2009, 18:48

Zeiger auf Basisklasse

Hi Forum!
Ich bins mal wieder mit einem kleinen Problem: Ich hab eine Basisklasse und davon abgeleitet eine abgeleitete Klasse. Nun hat die Basisklasse eine Memberfunktion, die als Parameter einen Zeiger auf die Basisklasse erwartet. Ruf ich diese Funktion mit einem Zeiger auf die Basisklasse auf, so funktioniert es perfekt, benutze ich einen Zeiger auf die abgeleitete Klasse, will nichts mehr.
Das sieht ungefähr so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class base
{
public:
int a, b;
//...

void dosth(base *param);
};

class derived : public base
{
public:
int c, d;
//...

};

void base::dosth(base *param)
{
// zum spaß etwas ausgeben

std::cout << param[0].a;
}

int main()
{
base Basis[4];
derived Abgeleitet[4];
Basis[0].a = Abgeleitet[0].a = 14;

Abgeleitet[2].dosth(Basis); // funktioniert

Abgeleitet[2].dosth(Abgeleitet); // hier gibts nen mist aus

}


Ich bin gerade echt verwirrt, hoffe ihr könnt mir helfen.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

29.01.2009, 19:01

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).

geht wohl nur über virtuelle funktionen.

wär doch ne idee für C++0x: virtuelle daten :D
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

4

29.01.2009, 19:08

Zitat von »"Gotbread"«

wär doch ne idee für C++0x: virtuelle daten :D

oder verbindliche Speicherreihenfolge: bases in der reihenfolge ihrer eintragungen bei der vererbung, dann die neuen daten der derieved

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

5

29.01.2009, 19:22

Mir fällt jetzt aber spontan auch kein Fall ein wo man so ein Konstrukt zwingend bräuchte.

6

29.01.2009, 19:42

Ok, sehr seltsam. Dieser Code war natürlich nur nach gleichem Aufbau nachgeschrieben und ich hab ihn deshalb nicht getestet. Er funktioniert auch bei mir, dann schau ich mal, was ich in meinem richtigen Projekt, in dem ich sowas verwende, anders ist.
Vielleicht hat einer von euch ja noch irgendeinen spontanen Einfall.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

7

29.01.2009, 19:46

So weit ich weiß ist nicht mal die Speicherreihenfolge innerhalb von structs im Standard definiert...

Dass das mit Bitfields Probleme gibt, ist ja leicht denkbar.
Oder auch zum Beispiel:

Du hast nen Struct von primitiven Datentypen und schreibst diesen binär in einem Wusch irgendwo hin, z.B. auf einen Netzwerk-Stream. An anderer Stelle ließt du die Daten. Nach jetzigem Stand der Dinge kannst du nur alle Daten auf ein mal in den Struct lesen, und selbst da bin ich mir grade nicht sicher, ob die Speicherreihenfolge keine Probleme machen würde. Wäre sie aber sichergestellt, könnte man jetzt z.B. das erste Feld in die eine Variable lesen, das zweite dann in eine andere, etc.

Oder? ^^
<< an dieser Stelle ist eine Signatur verstorben >>

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

8

29.01.2009, 20:22

Mach das doch, wie schon vorgeschlagen, mit virtuellen funktionen. Du machst dir damit wirklich das Leben leichter ;)

9

29.01.2009, 20:53

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).
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"«

wär doch ne idee für C++0x: virtuelle daten :D
Ein Einsatzbeispiel würde mich jetzt wirklich interessieren... ;)

Zitat von »"the[V«

oid"]So weit ich weiß ist nicht mal die Speicherreihenfolge innerhalb von structs im Standard definiert...
[...]
Oder? ^^
Nicht wirklich. Die Member sind innerhalb einer einzelnen Klasse in der Reihenfolge abgespeichert, in der sie deklariert wurden (möglicherweise noch ausgerichtet). Und wenn man sie per Variablenname aufruft, ist das sowieso kein Problem.

Zitat von »"K-Bal"«

Mach das doch, wie schon vorgeschlagen, mit virtuellen funktionen. Du machst dir damit wirklich das Leben leichter ;)
Virtuelle Funktionen bringen hier nichts. Diese werden nur benötigt, wenn polymorphes Verhalten erforderlich ist, die abgeleitete Klasse also eine andere Funktion (mit gleichem Namen) als die Basisklasse implementiert und man den Typ der referenzierten Klasse nicht zur Compilezeit festlegen kann.

Kurz gesagt, das Beispiel hier sollte funktionieren. Der Compiler hat dafür zu sorgen, dass der Cast (Derived* zu Base*) funktioniert.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

10

29.01.2009, 20:58

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).


Achja mist, das habe ich jetzt mit der Ausrichtung verwechselt glaub ich, die ist nämlich nicht festgelegt..
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige