Maison >développement back-end >C++ >Pourquoi la conversion implicite de « Enfant » en « Base » est-elle interdite dans l'héritage C ?

Pourquoi la conversion implicite de « Enfant » en « Base » est-elle interdite dans l'héritage C ?

DDD
DDDoriginal
2024-10-28 16:10:28424parcourir

 Why is Implicit Conversion from `Child` to `Base` Forbidden in C   Inheritance?

Conversion de pointeur en pointeur dans la hiérarchie d'héritage

Considérez le code C suivant :

<code class="cpp">class Base { };

class Child : public Base { };

int main() {
    Child *c = new Child();
    Base *b = c;  // Allowed

    Child **cc = &c;
    Base **bb = cc;  // Error: Conversion not allowed
}</code>

Justification de la restriction de conversion

L'erreur du compilateur dans la dernière ligne met en évidence la restriction sur la conversion implicite de Child** vers Base**. Cette restriction est imposée pour maintenir la sécurité des types.

Si cette conversion était autorisée, elle pourrait potentiellement conduire à des situations inattendues et erronées. Par exemple, on pourrait écrire :

<code class="cpp">*bb = new Base;</code>

Cela créerait une instance de Base et stockerait son adresse dans bb, écrasant ainsi la référence Child* originale pointée par c. Cela pourrait entraîner une corruption des données et un comportement imprévisible du programme.

Alternatives pour la conversion implicite

Bien qu'il n'existe aucun moyen direct de convertir implicitement Child** en Base** sans en s'appuyant sur le style C ou reinterpret_cast, il existe des approches alternatives pour obtenir la fonctionnalité souhaitée tout en préservant la sécurité des types.

  • Héritage virtuel : Avec l'héritage virtuel, une classe hérite de plusieurs parents classes via une seule copie de l’objet de classe de base. Cela peut être utilisé pour obtenir un comportement polymorphe sans les problèmes de conversion susmentionnés.
  • Classes de pont : On peut définir une classe intermédiaire qui hérite publiquement de Base et de Child et sert de pont entre le deux. Cela permet une diffusion explicite et contrôlée entre les différents types de pointeurs tout en maintenant la sécurité des types.

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