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
Libérer: 2024-10-28 16:10:28
original
414 Les gens l'ont consulté

 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>
Copier après la connexion

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>
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal