🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#1283
Author: Olaf Krzikalla
Date: Mon, 15 Jan 1996 10:36
21 lines
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
#1298
Author: Wernke zur Borg x2049
Date: Tue, 16 Jan 1996 12:47
49 lines
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