<< '\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 так и было, как ты хочешь. Но видимо нашли какие-то баги в стандарте, связанные с этим. (места, где это интуитивное поведение вызывает проблемы в другом интуитивно понятном коде) и ввели обязательное перекрытие родительских функций функциями дочернего класса.
 小
                          みかん
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          小
                          みかん
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Обсуждают сегодня