Maison >développement back-end >C++ >Comment effectuer en toute sécurité une diffusion dynamique vers des classes dérivées en C ?

Comment effectuer en toute sécurité une diffusion dynamique vers des classes dérivées en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-01 11:42:14748parcourir

How to Safely Perform Dynamic Casting to Derived Classes in C  ?

Casting dynamique en classes dérivées en C

Le cast dynamique est une technique utilisée pour convertir des objets de classes de base en classes dérivées. Cependant, cela peut entraîner des erreurs si l'objet n'est pas du type correct.

Problème :

Les tentatives de conversion d'un objet de classe de base en une classe dérivée entraînent l'erreur : "Impossible de convertir de BaseType en DerivedType. Aucun constructeur n'a pu prendre le type source, ou la résolution de surcharge du constructeur a été ambigu."

BaseType m_baseType;

DerivedType m_derivedType = m_baseType; // Error
DerivedType m_derivedType = (DerivedType)m_baseType; // Error
DerivedType * m_derivedType = (DerivedType*) &m_baseType; // Error

Solution :

Comprendre les concepts orientés objet est crucial pour éviter ces erreurs. Considérez la hiérarchie animale suivante :

class Animal { /* Virtual members */ };
class Dog : public Animal {};
class Cat : public Animal {};

Règles de diffusion :

  • Upcasting (de base vers dérivé) : Implicitement autorisé, comme un objet dérivé est également un objet de base.
  • Downcasting (Dérivé vers Base) : Nécessite Dynamic_cast<> opérateur. Renvoie NULL si l'objet n'est pas du type correct.

Exemples :

Dog     dog;
Cat     cat;
Animal& AnimalRef1 = dog;  // Upcasting OK
Animal& AnimalRef2 = cat;  // Upcasting OK
Animal* AnimalPtr1 = &dog; // Upcasting OK
Animal* AnimalPtr2 = &cat; // Upcasting OK

Cat&    catRef1 = dynamic_cast<Cat&>(AnimalRef1);  // Throws exception (not a cat)
Cat*    catPtr1 = dynamic_cast<Cat*>(AnimalPtr1);  // Returns NULL (not a cat)
Cat&    catRef2 = dynamic_cast<Cat&>(AnimalRef2);  // Succeeds
Cat*    catPtr2 = dynamic_cast<Cat*>(AnimalPtr2);  // Succeeds

Remarque importante :

Le casting dynamique doit être utilisé avec parcimonie, en particulier lorsque vous travaillez avec des hiérarchies d'héritage. Privilégiez plutôt les méthodes virtuelles pour le polymorphisme et l'accès aux propriétés des objets.

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!

Déclaration:
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