Thread View: de.comp.lang.c++
2 messages
2 total messages
Started by Olaf Krzikalla
Mon, 15 Jan 1996 10:36
"this" und mehrfacher Vererbung
Author: Olaf Krzikalla
Date: Mon, 15 Jan 1996 10:36
Date: Mon, 15 Jan 1996 10:36
21 lines
1516 bytes
1516 bytes
Hi Leute, ich hab ein Problem mit mehrfacher Vererbung: class A : B,C; Dabei sind sowohl B als auch C von einer Listenklasse abgeleitet, A ist also in zwei Listen eingetragen. Das Linken und Unlinken in den Listen geschieht u.a. ueber die Verwendung von "this". Das macht aber Probleme, da beim Aufruf this nicht unbedingt auf das abgeleitete Objekt zeigt. Das ist ja eigentlich auch logisch, da die Funktionen der Basisklasse ja einen Zeiger auf ihre Datenstruktur erwartet und dieser implizite Zeiger gleich als explizites this mitverwendet wird. Im vorliegenden Fall führt das natürlich zu Fehlern. Frage: Ist das eine Compiler-Schwaeche (WATCOM), ein noch nicht standardisierter Fall oder mach ich einen Fehler. Wie kann ich das Problem umgehen ? Momentan definiere ich in Klasse C einen Pointer my_A auf A. C ist dann (immer und nur!) Member von A. Natuerlich muss ich dann jedesmal noch dereferenzieren, allzu elegant ist das also nicht. Ciao Olaf
Re: "this" und mehrfacher Vererbung
Author: Wernke zur Borg x2049
Date: Tue, 16 Jan 1996 12:47
Date: Tue, 16 Jan 1996 12:47
49 lines
2444 bytes
2444 bytes
Olaf Krzikalla (ok4@irz.inf.tu-dresden.de) wrote:
> Hi Leute,
> ich hab ein Problem mit mehrfacher Vererbung:
> class A : B,C;
> Dabei sind sowohl B als auch C von einer Listenklasse abgeleitet, A ist also in
> zwei Listen eingetragen. Das Linken und Unlinken in den Listen geschieht u.a.
> ueber die Verwendung von "this". Das macht aber Probleme, da beim Aufruf this
> nicht unbedingt auf das abgeleitete Objekt zeigt. Das ist ja eigentlich auch
> logisch, da die Funktionen der Basisklasse ja einen Zeiger auf ihre
> Datenstruktur erwartet und dieser implizite Zeiger gleich als explizites this
> mitverwendet wird.
Es ist nicht ganz klar, was du meinst. Die Basisklasse sieht
natuerlich "ihre Datenstruktur" unter dem this-Zeiger. Das allein kann
noch nicht zu Problemen fuehren. Problematisch wird's, wenn B und C
von derselben Klasse D abgeleitet sind, und du damit eine "diamond
shape"-Vererbung hast. Damit sind die Daten-Member der Klasse D
mehrfach in A vorhanden, und du bekommst Mehrdeutigkeiten beim Zugriff
auf diese Member. In diesem Fall hilft die Deklaration von D als
virtuelle Basisklasse von B und C:
class B : virtual public D {...};
class C : virtual public D {...};
class A : public B, public C {...};
was dazu fuehrt, dass die Daten von D nur einmal in A vorhanden sind
und damit auch keine Mehrdeutigkeiten mehr existieren.
In jedem Konstruktor der Klasse A musst du dann alle Baseclass-
Konstruktoren aufrufen, falls sie keinen Default-Konstruktor
haben:
A::A(...) : B(...), C(...), D(...) {...}
Weitere Restriktionen bzgl. virtueller Basisklassen kannst du in jedem
C++ Lehrbuch nachlesen.
> ...
Hope that helps.
______________________________________________________________________
Wernke zur Borg Tel: +49-6151-90-2049
Cray Systems GmbH Fax: +49-6151-90-3414
c/o ESOC/European Space Operations Centre email: wzb@esoc.esa.de
D-64293 Darmstadt/Germany
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads