c++ - функцию - функции в структуре с++




Почему вызов функции структуры C++ неоднозначен, если есть унаследованные члены с различными параметрами? (2)

Вызов неоднозначен, потому что обе базы A и C структуры D имеют функцию void f() , даже если функция A f() скрыта. Чтобы устранить неоднозначность, вы должны объявить f () в D.

struct A {
    void f() {}
};

struct B: virtual A {
    void f(int i) {}   // <  hides A::f(), even if signature is different,
};

struct C: virtual A {
    void f() {}        // <  hides A::f()
};

struct D: B, C {
                       // f(...) functions in both base... which one hides the other?
};

Код ниже. У меня есть одна функция f () и одна функция f (int) в моем классе D, так почему этот вызов неоднозначен, если обе функции имеют разные параметры?

struct A {
    void f() {}
};

struct B: virtual A {
    void f(int i) {}
};

struct C: virtual A {
    void f() {}
};

struct D: B, C {

};

int main()
{
    D d;
    d.f(5); //ambiguous
}

Проблема здесь заключается в поиске имени члена, которое происходит до оценки того, какие функции являются жизнеспособными, и применения разрешения перегрузки. Когда поиск имени находит имена из двух или более несвязанных базовых классов, это считается неоднозначным поиском, который сразу же становится недействительным.

Для получения дополнительной информации читайте о поиске безоговорочного имени в определениях членов класса . (Это на самом деле не тот контекст, который у вас здесь есть, но те же правила применяются к выражению доступа к элементу.)

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

d.B::f(5);

Или вы можете сделать обе функции явно видимыми непосредственно в D :

struct D: B, C {
    using B::f;
    using C::f;
};




virtual