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.
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