Heim >Backend-Entwicklung >C++ >Wie kann man einen eindeutigen Zeiger der Basis sicher auf einen eindeutigen Zeiger der Ableitung umwandeln?
Downcasting vom eindeutigen Zeiger der Basis zum eindeutigen Zeiger der Ableitung
Beim Arbeiten mit Klassenhierarchien und Vererbung kann es notwendig sein, a herunterzuschreiben Eindeutiger Zeiger von einer Basisklasse auf eine abgeleitete Klasse, um auf bestimmte Funktionen zuzugreifen. Dies tritt häufig auf, wenn eine Factory-Methode einen eindeutigen Zeiger auf die Basisklasse zurückgibt, das eigentliche Objekt jedoch von einem abgeleiteten Typ ist.
Um Downcasting durchzuführen, wird oft empfohlen, einen zweistufigen Ansatz zu verfolgen. Geben Sie zunächst das Objekt mithilfe seiner release()-Methode vom eindeutigen Zeiger frei. Dadurch wird die zugrunde liegende Ressource freigegeben und ein Rohzeiger auf das abgeleitete Klassenobjekt zurückgegeben. Zweitens verwenden Sie eine Funktion, um den Rohzeiger auf die gewünschte abgeleitete Klasse umzuwandeln und ihn einem neuen eindeutigen Zeiger neu zuzuweisen.
Hier ist ein Beispiel einer CastToDerived()-Funktion, die einen sicheren Downcast durchführt:
template<typename Derived, typename Base> std::unique_ptr<Derived> CastToDerived(Base* obj) { return std::unique_ptr<Derived>(static_cast<Derived*>(obj)); }
Diese Funktion kann verwendet werden, um einen eindeutigen Zeiger einer Basisklasse auf einen eindeutigen Zeiger einer abgeleiteten Klasse herunterzuwandeln Zeiger:
unique_ptr<Derived> ptr = CastToDerived(DerivedAFactory());
Wenn die statische Umwandlung unzuverlässig ist, können Sie alternativ die folgenden Funktionsvorlagen verwenden, die statische oder dynamische Umwandlungen basierend auf der Typsicherheit des Downcasts durchführen:
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> static_unique_ptr_cast( std::unique_ptr<Base, Del>& p ) { auto d = static_cast<Derived *>(p.release()); return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter())); } template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast( std::unique_ptr<Base, Del>& p ) { if(Derived *result = dynamic_cast<Derived *>(p.get())) { p.release(); return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter())); } return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter()); }
Diese Funktionen stellen sicher, dass die Ressource ordnungsgemäß entsorgt wird und der eindeutige Zeiger mit der entsprechenden Löschfunktion erstellt wird.
Das obige ist der detaillierte Inhalt vonWie kann man einen eindeutigen Zeiger der Basis sicher auf einen eindeutigen Zeiger der Ableitung umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!