Maison  >  Article  >  développement back-end  >  Pourquoi l’invocation explicite de méthodes est-elle requise pour les méthodes surchargées dans les classes dérivées ?

Pourquoi l’invocation explicite de méthodes est-elle requise pour les méthodes surchargées dans les classes dérivées ?

DDD
DDDoriginal
2024-11-02 12:50:02997parcourir

Why is Explicit Method Invocation Required for Overloaded Methods in Derived Classes?

Résolution de surcharge en C : sélection explicite de méthode requise

En C, la résolution de surcharge se produit en fonction des types d'arguments et des étendues dans lesquelles une méthode est déclaré. Pour garantir une sélection précise de la méthode, certains scénarios nécessitent une invocation explicite de la méthode.

Considérons l'exemple suivant :

<code class="cpp">class A {
  public:
    int DoSomething() { return 0; }
};

class B : public A {
  public:
    int DoSomething(int x) { return 1; }
};

int main() {
  B* b = new B();
  b->A::DoSomething(); // Why this?
  // b->DoSomething(); // Why not this? (Compiler error)
  delete b;
  return 0;
}</code>

Pourquoi l'instruction b->A::DoSomething(); nécessaire ?

Comprendre la résolution de surcharge :

Dans ce cas, le compilateur prend en compte la portée de la méthode lors de l'exécution de la résolution de surcharge. Par défaut, il recherche uniquement dans la portée de la classe actuelle une correspondance de méthode. Dans la classe B, le compilateur trouve DoSomething(int) dans la portée actuelle, qui accepte un seul argument int.

Invocation explicite requise :

Cependant, la classe parent A déclare également une version de DoSomething() qui ne prend aucun argument. Pour accéder à cette méthode dans la classe dérivée B, elle doit être explicitement invoquée à l'aide de l'opérateur de portée de classe (A::).

L'instruction b->DoSomething(); la compilation échouerait car le compilateur ne peut pas trouver une méthode nommée DoSomething() sans arguments dans la portée de la classe B. Il suppose à tort que DoSomething(int) est la méthode prévue.

Solutions :

Pour résoudre ce problème, une solution consiste à introduire la déclaration using dans la classe B. Cela extrait la méthode DoSomething() de la classe parent dans la portée de la classe dérivée :

<code class="cpp">class B : public A {
public:
    using A::DoSomething;
    // …
};</code>

Avec cette modification, la résolution de surcharge peut désormais identifier correctement la méthode DoSomething() souhaitée, éliminant ainsi le besoin d'une invocation explicite à l'aide de b->A::DoSomething();.

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