"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que a herança múltipla não suporta funções sobrecarregadas com o mesmo nome, mas assinaturas diferentes?

Por que a herança múltipla não suporta funções sobrecarregadas com o mesmo nome, mas assinaturas diferentes?

Publicado em 23/12/2024
Navegar:271

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

Funções sobrecarregadas com herança múltipla

Em C , a sobrecarga de funções permite que múltiplas funções com o mesmo nome sejam definidas em um único escopo, desde que eles têm listas de parâmetros diferentes. No entanto, esse comportamento não se estende a funções herdadas múltiplas com o mesmo nome, mas com assinaturas diferentes. Isso levanta a questão: por que tais funções não são tratadas como sobrecarregadas?

De acordo com a Seção 10.2/2 do Padrão C, as regras de pesquisa de membros determinam que as declarações ocultas sejam eliminadas da consideração durante a pesquisa de nomes. Quando múltiplas classes base definem funções com o mesmo nome, mas parâmetros diferentes, essas funções podem ficar ocultas umas das outras. Portanto, se o conjunto resultante de declarações não for de subobjetos do mesmo tipo, ou incluir um membro não estático e membros de diferentes subobjetos, surge uma ambiguidade e o programa é considerado mal formado.

Por exemplo:

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

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

class C : public A, public B {};

Neste caso, f é ambíguo porque é definido em duas classes base diferentes (A e B). Portanto, a seguinte chamada para f da classe C está incorreta:

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

Para resolver essa ambigüidade, você pode usar a declaração using para especificar qual classe base implementa a função f. Por exemplo:

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

Com esta modificação, c.f() agora chama explicitamente f da classe A, resolvendo a ambiguidade.

Em contraste, o segundo exemplo de código que você forneceu funciona porque foo(float) está definido está dentro do escopo da classe Derived e não é herdado de várias classes base. Portanto, d.foo(5) chama a função foo(float) diretamente, sem qualquer ambiguidade.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3