Maison > développement back-end > C++ > Comment puis-je résoudre les problèmes de masquage de fonctions lors de la surcharge de fonctions dans l'héritage C ?

Comment puis-je résoudre les problèmes de masquage de fonctions lors de la surcharge de fonctions dans l'héritage C ?

DDD
Libérer: 2025-01-02 17:39:44
original
478 Les gens l'ont consulté

How Can I Resolve Function Hiding Issues When Overloading Functions in C   Inheritance?

Surcharge de fonctions dans l'héritage : compréhension des fonctions cachées

Dans la programmation orientée objet, l'héritage permet aux classes d'hériter des propriétés et des méthodes des classes parents. Cependant, lors de la définition de fonctions portant le même nom mais des signatures différentes dans les classes de base et dérivées, la recherche de nom peut devenir ambiguë, entraînant des erreurs.

Problème :

Considérez le extrait de code suivant :

class A
{
public:
    void foo(string s){};
};

class B : public A
{
public:
    int foo(int i){};
};

class C : public B
{
public:
    void bar()
    {
        string s;
        foo(s); // Error: member function not found
    }
};
Copier après la connexion

Lors de la tentative d'appel de la fonction foo remplacée dans la classe dérivée C, le compilateur rencontre une erreur car la recherche de nom s'arrête à la classe dérivée B et ne peut pas trouver le foo hérité de la classe de base A.

Solution :

Pour résoudre ce problème, la fonction de la classe de base doit être explicitement déclaré dans la portée de la classe dérivée à l'aide du mot clé using. Cela rend les deux fonctions visibles depuis l'intérieur de la classe dérivée.

class A
{
public:
    void foo(string s){};
};

class B : public A
{
public:
    int foo(int i){};
    using A::foo; // Re-declare function from base class
};

class C : public B
{
public:
    void bar()
    {
        string s;
        foo(s); // Now calls the inherited 'foo' function
    }
};
Copier après la connexion

Explication :

La recherche de nom dans l'héritage est hiérarchique. Par défaut, la recherche de nom donne la priorité aux fonctions définies dans la classe dérivée. Dans l'exemple ci-dessus, lorsque foo(s) est appelé en C, le compilateur recherche d'abord une fonction correspondante en C, puis en B et enfin en A. Cependant, puisque B a sa propre fonction foo, la recherche s'arrête là : entraînant l'erreur.

En déclarant explicitement la fonction foo de la classe de base dans B à l'aide de A::foo, le compilateur est invité à prendre en compte les deux fonctions lors de la recherche de nom. Cela permet de trouver et d'invoquer la fonction foo héritée à partir de C.

Essentiellement, cette technique résout le problème du masquage des fonctions dans les classes dérivées et garantit une recherche de nom correcte lorsque vous travaillez avec des fonctions surchargées dans les hiérarchies d'héritage.

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