Maison > développement back-end > C++ > Comment downcast en toute sécurité un `unique_ptr` de base vers dérivé en C ?

Comment downcast en toute sécurité un `unique_ptr` de base vers dérivé en C ?

Susan Sarandon
Libérer: 2024-11-23 11:03:35
original
843 Les gens l'ont consulté

How to Safely Downcast a `unique_ptr` from Base to Derived in C  ?

Comment downcaster un unique_ptr de base en dérivé

Dans la programmation orientée objet, il est courant d'utiliser des hiérarchies de classes pour représenter des objets réels. notions du monde. En C , cela se fait souvent en utilisant l'héritage. L'héritage permet à une classe dérivée d'hériter des propriétés et du comportement de sa classe de base.

Un besoin courant lorsque l'on travaille avec des hiérarchies de classes est de convertir un pointeur vers une classe de base en un pointeur vers une classe dérivée. Ce processus est connu sous le nom de downcasting.

Dans le contexte de pointeurs uniques, le downcasting peut être un peu délicat. En effet, les pointeurs uniques sont conçus pour éviter les pointeurs suspendus et autres problèmes de mémoire. Par conséquent, vous ne pouvez pas simplement utiliser un static_cast pour convertir un unique_ptr en un type différent.

Au lieu de cela, vous devez utiliser l'une des méthodes suivantes :

1. Static Unique Pointer Cast

Cette méthode peut être utilisée lorsque vous êtes certain que le pointeur unique contient réellement un pointeur vers une classe dérivée. Le modèle de fonction suivant peut être utilisé pour effectuer une conversion de pointeur unique statique :

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()));
}
Copier après la connexion

2. Dynamic Unique Pointer Cast

Cette méthode peut être utilisée lorsque vous n'êtes pas certain que le pointeur unique contient un pointeur vers une classe dérivée. Le modèle de fonction suivant peut être utilisé pour effectuer une conversion de pointeur unique dynamique :

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());
}
Copier après la connexion

Exemple

Le code suivant montre comment utiliser la conversion de pointeur unique statique pour convertir un unique_ptr en un type différent :

#include <memory>

class Base {
public:
  virtual ~Base() {}
};

class Derived : public Base {
public:
  ~Derived() {}
};

int main() {
  std::unique_ptr<Base> uptr = std::make_unique<Derived>();
  std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr));
  return 0;
}
Copier après la connexion

Dans cet exemple, nous créons un unique_ptr en un objet de base. Nous utilisons ensuite le cast de pointeur unique statique pour convertir le unique_ptr en unique_ptr en un objet Derived. Ceci est possible car nous savons que le unique_ptr de l'objet Base contient en fait un pointeur vers un objet Derived.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal