C++ - upcasting und downcasting
In meinem Beispiel:
In upcasting, sollte nicht die zweite d.print()
call print "base"?
Ist es nicht "d" abgeleitete Objekt upcasted auf eine Basisklasse für ein Objekt?
Und downcasting, welche Vorteile hat es?
Können Sie uns erklären, Verallgemeinerung und niedergeschlagen in einer praktischen Art und Weise?
#include <iostream>
using namespace std;
class Base {
public:
void print() { cout << "base" << endl; }
};
class Derived :public Base{
public:
void print() { cout << "derived" << endl; }
};
void main()
{
//Upcasting
Base *pBase;
Derived d;
d.print();
pBase = &d;
d.print();
//Downcasting
Derived *pDerived;
Base *b;
pDerived = (Derived*)b;
}
- Warum denkst du, dass die
pBase
Linie sollte sich ändern, das Verhalten vond.print();
? Meinst du Fragen überpBase->print();
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Up-casting ist implizit, die in C++, und wird verwendet, eine Menge, wenn man viel mit virtuellen Versand. In anderen Worten, Sie haben einen Zeiger auf
Base
von der aus Sie zugreifen können, die gemeinsame Schnittstelle für eine ganze Hierarchie von Klassen, und die Auswahl kann getan werden zur Laufzeit. Dies setzt Voraus, dass die interface-Funktionen sind gekennzeichnetvirtual
. Beispiel:Ist es äußerst sinnvoll, in diesen Situationen, in denen der Versand erfolgt zur Laufzeit. Einfach gesagt, upcasting erlaubt es, die Behandlung einer abgeleiteten Klasse als Basisklasse (über dessen gemeinsame Schnittstelle).
Down-casting ist weniger nützlich, und IMO sollte vermieden werden, Wann immer man kann. Im Allgemeinen ist ein Zeichen für schlechtes design, da man nur selten braucht, um zu konvertieren eine
Base
Objekt einer abgeleiteten ein. Es kann getan werden (und das Ergebnis überprüft) überdynamic_cast
, wieDieser link bietet eine durchaus nützliche Einführung in das Thema.
dynamic_cast<Derived>
solltedynamic_cast<Derived *>
.Base* p = new Derived
ist (implizite) upcasting, nicht downcasting. Upcasting verwendet wird, weit mehr als downcasting. Wieder, IMO,dynamic_cast
sollte sein verwendet sparsam.static_cast
verwendet werden muss Dünn.dynamic_cast
ist eine Menge verwendet, und bietet einen sicheren Weg, um konvertieren von einem Typ in einen anderen. Wenn es um die Umwandlung von einer Basis in eine abgeleitete, es gibt bestimmte Funktionen, die von abgeleiteten, die sonst aufblähen oder stören die Basis-Schnittstelle. Vielleicht sind Sie auf der Suche nach Dinge zu generisch oder Leser das technische design von POV eher als philosophische.static_cast
auf dynamische Typen. Upcasting implizit ist, obwohl es nur über die Steuerung der Schnittstelle einer Klasse Hierarchie über einen base-Zeiger. Und das ist wichtig IMO.Müssen Sie die Verwendung von virtuellen Methoden, um zu ermöglichen,RTTI.
In Ihrem Fall, da Sie C++, sollten Sie sich auf sicherer casting-Mechanismen. Also, statt
(Derived*)b
, Sie sollten mitdynamic_cast<Derived*>(b)
. Dies ermöglicht es Ihnen, um sicherzustellen, dass Sie tatsächlich im Besitz eines Zeigers auf ein Objekt einer Basisklasse (Schnittstelle), die erhalten wurde, indem man ein Objekt vom TypDerived
. Auf dieser Seite bietet weitere Erläuterungen.