"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué la herencia múltiple no admite funciones sobrecargadas con el mismo nombre pero con diferentes firmas?

¿Por qué la herencia múltiple no admite funciones sobrecargadas con el mismo nombre pero con diferentes firmas?

Publicado el 2024-12-23
Navegar:609

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

Funciones sobrecargadas con herencia múltiple

En C, la sobrecarga de funciones permite definir múltiples funciones con el mismo nombre dentro de un único alcance, siempre que Tienen diferentes listas de parámetros. Sin embargo, este comportamiento no se extiende a funciones heredadas múltiples con el mismo nombre pero firmas diferentes. Esto plantea la pregunta: ¿por qué estas funciones no se tratan como sobrecargadas?

De acuerdo con la Sección 10.2/2 del Estándar C, las reglas de búsqueda de miembros dictan que las declaraciones ocultas se eliminan de la consideración durante la búsqueda de nombres. Cuando varias clases base definen funciones con el mismo nombre pero con diferentes parámetros, estas funciones pueden estar ocultas entre sí. Por lo tanto, si el conjunto resultante de declaraciones no proviene de subobjetos del mismo tipo, o incluye un miembro no estático y miembros de diferentes subobjetos, surge una ambigüedad y el programa se considera mal formado.

Por ejemplo:

class A {
public:
  int f(int);
};

class B {
public:
   int f();
};

class C : public A, public B {};

En este caso, f es ambigua porque está definida en dos clases base diferentes (A y B). Por lo tanto, la siguiente llamada a f desde la clase C es incorrecta:

int main() {
  C c;
  c.f();  // ambiguous
}

Para resolver esta ambigüedad, puede usar la declaración de uso para especificar qué clase base implementa la función f. Por ejemplo:

class C : public A, public B {
     using A::f;
     using B::f;
};

Con esta modificación, c.f() ahora llama explícitamente a f desde la clase A, resolviendo la ambigüedad.

En contraste, el segundo ejemplo de código que proporcionó funciona porque foo(float) está definido dentro del alcance de la clase Derivada y no se hereda de múltiples clases base. Por lo tanto, d.foo(5) llama a la función foo(float) directamente, sin ninguna ambigüedad.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3