«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему множественное наследование не поддерживает перегруженные функции с одинаковым именем, но разными сигнатурами?

Почему множественное наследование не поддерживает перегруженные функции с одинаковым именем, но разными сигнатурами?

Опубликовано 23 декабря 2024 г.
Просматривать:998

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

Перегруженные функции с множественным наследованием

В C перегрузка функций позволяет определять несколько функций с одинаковым именем в одной области при условии, что у них разные списки параметров. Однако такое поведение не распространяется на множественные унаследованные функции с одинаковым именем, но разными сигнатурами. Возникает вопрос: почему такие функции не считаются перегруженными?

Согласно разделу 10.2/2 стандарта C, правила поиска членов предписывают, чтобы скрытые объявления исключались из рассмотрения во время поиска имени. Когда несколько базовых классов определяют функции с одинаковым именем, но разными параметрами, эти функции могут быть скрыты друг от друга. Следовательно, если результирующий набор объявлений не принадлежит подобъектам одного и того же типа или включает нестатический член и члены из разных подобъектов, возникает неоднозначность и программа считается неправильно сформированной.

Например:

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

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

class C : public A, public B {};

В этом случае f неоднозначен, поскольку он определен в двух разных базовых классах (A и B). Следовательно, следующий вызов f из класса C неверен:

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

Чтобы устранить эту двусмысленность, вы можете использовать объявление using, чтобы указать, какой базовый класс реализует функцию f. Например:

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

Благодаря этой модификации c.f() теперь явно вызывает f из класса A, устраняя неоднозначность.

Напротив, второй приведенный вами пример кода работает, потому что определен foo(float) находится в области производного класса и не наследуется от нескольких базовых классов. Таким образом, d.foo(5) вызывает функцию foo(float) напрямую, без какой-либо двусмысленности.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3