Article View: de.comp.lang.c++
Article #965Re: casting-Probleme mit virtueller Vererbung
From: Karl-Heinz Krause
Date: Tue, 05 Dec 1995 16:23
Date: Tue, 05 Dec 1995 16:23
79 lines
2601 bytes
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!KrauseReferences:
<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