<< '\n'; } };
struct B { void print(std::string str) { std::cout << str << '\n'; } };
struct C : A, B {};
int main()
{
C c;
c.print(42);
return 0;
}
Почему print не оверлодиться? Итуитивно оба print должны стать частью одного overload set, но компилятор такое впечатление пытается достать print не смотря на cигнатуру, которую хотят вызвать.
source>: In function 'int main()':
<source>:92:7: error: request for member 'print' is ambiguous
92 | c.print(42);
| ^~~~~
<source>:70:17: note: candidates are: 'void B::print(std::string)'
70 | struct B { void print(std::string str) { std::cout << str << '\n'; } };
| ^~~~~
<source>:69:17: note: 'void A::print(int)'
69 | struct A { void print(int num) { std::cout << num << '\n'; } };
| ^~~~~
https://www.stroustrup.com/bs_faq2.html#overloadderived
Usinig Надо в дочернем классе...
Действительно, механизмы немного разные У Страуструпа срабатывает https://eel.is/c++draft/basic.lookup#class.member.lookup-3, у нас https://eel.is/c++draft/basic.lookup#class.member.lookup-4 + https://eel.is/c++draft/basic.lookup#class.member.lookup-5.2 Но смысл тот же, нужно явно в скоуп принести оба метода
Спасибо... это всё намного намного усложняет((
забавно, я не смог lookup-5.2 на cppreference найти
Изначально в С++ 98 так и было, как ты хочешь. Но видимо нашли какие-то баги в стандарте, связанные с этим. (места, где это интуитивное поведение вызывает проблемы в другом интуитивно понятном коде) и ввели обязательное перекрытие родительских функций функциями дочернего класса.
Обсуждают сегодня