Verallgemeinerung und Niedergeschlagen in C++
class file {
std::string name;
};
class directory : public file {
std::vector<file*> entries;
};
directory d;
file f;
f = d; //Only d.name is copied to f; entries are lost
Ist es, wenn wir dies tun:
directory* dp = new directory;
file* fp ;
fp = dynamic_cast<file*>(dp);
Hält Einträge und Identität als ein directory-Objekt oder nur noch dp->name
kopiert f
; Einträge sind verloren.
Auch, wie wirkt niedergeschlagen Arbeit?
Was passiert, wenn wir tun:
dp = dynamic_cast<dp*> (fp);
Eine kleine sidenote: Sie sollten nicht zuweisen Zeiger mit
Keine Zuordnung, weder
Sie sind nicht sehr vertraut mit
new
wenn Sie zuweisen möchten, Zeiger später, es ist ein Speicher-Leck.Keine Zuordnung, weder
dynamic_cast<>
arbeiten wird, weil Sie verwenden private bei der Vererbung. Außerdem, was ist Ihre Frage?Sie sind nicht sehr vertraut mit
delete
sind Sie?InformationsquelleAutor Mayuresh | 2011-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Erklärung, was casting-und down-casting übernommen von link:
questionscompiled.com
Upcasting:
Verallgemeinerung ist die Umwandlung von Zeiger oder eine Referenz der abgeleiteten Klasse Typ Zeiger oder eine Referenz der Basisklasse-Typ, in der vererbungsstruktur.
Upcasting hilft bei der Erreichung Schnittstellen-Konzept in C++. Wenn eine Funktion aufgerufen wird, die auf Basisklasse-Typ Zeiger oder Referenz(zeigt oder bezieht sich auf etwas von Ihr abgeleiteten Klasse), richtige Memberfunktion der abgeleiteten Klasse wird aufgerufen.
Downcasting:
Niedergeschlagen ist die Umwandlung von Zeiger oder eine Referenz der Basisklasse-Typ, pointer oder Referenz-Typ der abgeleiteten Klasse, sinken in der vererbungsstruktur. Erreicht wird dies mit Hilfe des dynamic_cast-operator, der sicher niedergeschlagen.
Hier ist ein Beispiel:
Mit Verweis auf obigen Beispiel, dynamic_cast sorgt dafür, dass die ptr-Punkte zum Objekt von Typ B oder seiner Unterklasse.
InformationsquelleAutor bitdeveloper
Ich werde versuchen zu erklären, einfach, aber Sie sollten noch mehr Dokumentation.
Dies ist, weil die Verzeichnis-und Datei sind von verschiedenen Arten und Größen. Datei hat eine Größe
sizeof(file)
- und Verzeichnis -sizeof(directory)
, die größer ist alssizeof(file)
. Auch einen raw-Speicher kopieren würde nur kopieren Sie die Datei Teil des Verzeichnisses auf dem file-Objekt, oder geben Undefiniertes Verhalten, wenn Sie beabsichtigt, zu kopieren mehr.First off, dynamic cast funktioniert hier nicht, da diese nicht polymorphe Typen. Wenn Sie es Tat, dies sind nur Hinweise. Da directory
is-a
- Datei können Sie auf ein Verzeichnis mit einer Datei-Zeiger. Das Objekt ist auf dem jeweiligen Standort. Aber Sie don ' T haben Zugang zu exklusiven Mitglieder-Verzeichnis über den Datei-pointer, es sei denn, Sie werfen zurück.Du bist Wiedererlangung directory-Mitglied Zugriff auf Ihre original-Zeiger, wie oben erklärt.
InformationsquelleAutor Luchian Grigore
Vererbung zeigt die Beziehung "ist ein". Angesichts der Kontext Ihrer Frage die folgende ist nicht sehr sinnvoll:
Nur weil beide Verzeichnisse und Dateien haben Namen, bedeutet nicht, dass ein
directory "is a" file
. Ebenfalls wäre es unangemessen zu sagen, dass einfile "is a" directory
.Es gibt viele andere Linien der Argumentation könnte man hier nehmen. Beispielsweise könnten Sie argumentieren, dass sowohl Dateien als auch Verzeichnisse sind Fälle von
thing_that_has_a_name
:(Das ist eine Art, die über Sie gehen, aber die Vererbung ist eine eher schwerfällige Mechanismus. Wenn Sie erstellen von Basis-Klassen für Dinge wie den abstrakten Begriff der "name" dann werden Sie schnell finden, selbst benötigen, um zu Erben aus mehreren Basisklassen.)
Bringen diese zurück zu tragen, auf die technischen Aspekte der was Sie suchen, welchen Sie haben zu erinnern ist, dass es einen großen Unterschied zwischen erstellen von neuen Objekten vs. die Verknüpfung mit einer vorhandenen Datei oder ein Verzeichnis-Objekt als
thing_that_has_a_name
. Wenn Sie jemals eine Erklärung wie:Diese sind Instanziierungen. Konstruktoren werden ausgeführt. Was auch immer der
sizeof
ein Verzeichnis ist, das ist, wie viel Speicherd
gerade. Was auch immer dersizeof
eine Datei ist, das ist, wasf
gerade. Allerdings:Diese lediglich eine Referenz und Zeiger, Datumfenster, über die Sie interagieren können mit der Verzeichnis-und Datei-Objekte über die Schnittstelle angegeben, die in Ihrer Basisklasse. "Upcasting" wie dieses (so genannte "up", weil Sie klettern die Klassen-Hierarchie in Richtung der Wurzel) ist relativ sicher...und nicht ein Zeichen dafür, dass man etwas falsch.
Auf der anderen Seite, "Downcasting" kann gefährlich sein. Wir wissen, dass jeder
directory
undfile
behandelt werden kann wie einething_that_has_a_name
...aber wenn Sie einen Zeiger oder eine Referenz auf einething_that_has_a_name
dann beliebigen code können nicht sicher sein, dass es eindirectory
oderfile
. Es gibt Möglichkeiten zum einfügen von bedingten code zu überprüfen, und sicher sein, aber dies ist oft als ein Zeichen, dass Sie etwas falsch machen in Ihrem design:http://en.wikipedia.org/wiki/Run-time_type_information
Anderen haben einige mehr details, so werde ich hier aufhören, aber nur werfen es da draußen in den Fall, Sie finden etwas nützliches über Sie.
InformationsquelleAutor HostileFork