Heim >Backend-Entwicklung >C++ >Wie kann man einen eindeutigen Zeiger der Basis sicher auf einen eindeutigen Zeiger der Ableitung umwandeln?

Wie kann man einen eindeutigen Zeiger der Basis sicher auf einen eindeutigen Zeiger der Ableitung umwandeln?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-03 03:16:10516Durchsuche

How to Safely Downcast a Unique Pointer of Base to a Unique Pointer of Derived?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn