🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #965

Re: casting-Probleme mit virtueller Vererbung

#965
From: Karl-Heinz Krause
Date: Tue, 05 Dec 1995 16:23
79 lines
2601 bytes
Am 4. Dez. 1995 schrieb Haiko Emmel (100321.1321@compuserve.com):

> Hallo,

> ich bin heute auf folgendes casting-Problem gestossen:

> // Uebersetzt mit Borland C++ 3.1

> class Base
> {
> public:
> 	char base() const { return('b'); }
> };

> class Meddle : virtual public Base
> {
> public:
> 	char meddle() const { return('m'); }
> };

> class Medium : virtual public Base
> {
> public:
> 	char medium() const { return('M'); }
> };

> class Top : public Meddle, public Medium
> {
> public:
> 	char top() const { return('t'); }
> };

> main()
> {
> 	Base* bPtr;
> 	Medium* mPtr;
> 	Meddle* MPtr;
> 	Top* tPtr;

> 	tPtr=new Top();
> 	bPtr=(Base*) tPtr;		// funktioniert!

Hier reicht "bPtr=tPtr;". Die Umwandlung in einen Zeiger auf eine
Basisklasse geht automatisch. Da Casting immer eine problematische Sache
ist, sollte man auf das Hinschreiben redundanter Castings verzichten.

> 	mPtr=(Medium*) bPtr;		// can not cast Base * to Medium *
> 	MPtr=(Meddle*) bPtr;		// can not cast Base * to Meddle *
> 	delete(tPtr);

> }

> Mich wundert es, dass der Compiler da nicht casten kann. Wenn man von
> der Basisklasse base nicht virtuelle erbt, klappt es mit dem casting!
> Ist das nun ein Borland-Problem, oder geht das in C++ prinzipiell
> nicht, oder gibt es einen Trick, wie man das trotzdem hinbekommt?

Da gibt es nichts zu wundern, das entspricht genau den Regeln von C++:
das Casten eines Zeigers in einen spezielleren Typ ist nur bei
nichtvirtueller Vererbung erlaubt.

Um das trotzdem hinzubekommen, gibt es nicht nur einen Trick, sondern
eine höchst offizielle Methode, nämlich

	mPtr = dynamic_cast<Medium*>(bPtr);

Allerding ist dynamic_cast in BC 3.1 noch nicht implementiert -- ein
Compiler-Update wäre also fällig.

Es gibt noch eine weitere Einschränkung von dynamic_cast: Die Klasse,
von der gecastet wird, muß polymorph sein, d. h. mindestens eine
virtuelle Funktion oder einen virtuellen Destruktor enthalten. Deshalb
sollte man in den public-Bereich von Base noch folgendes hinzufügen:

	virtual ~Base() {}



Karl-Heinz Krause
Technical Details
Message-ID: <4a1v60$cop@news00.btx.dtag.de>
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!not-for-mail!Krause
References: <49vm09$anh@dub-news-svc-6.compuserve.com>

Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++
Message-ID: <4a1v60$cop@news00.btx.dtag.de>
From: Krause@btx.dtag.de (Karl-Heinz Krause)
Path: arc1-ca.pugleaf.net!news00.btx.dtag.de!not-for-mail!Krause
Subject: Re: casting-Probleme mit virtueller Vererbung
Date: Tue, 05 Dec 1995 16:23:12 +0000
References: <49vm09$anh@dub-news-svc-6.compuserve.com>
X-Gateway: ZCONNECT XX ius.gun.de [UNIX/Connect v0.73]
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit