История изменений
Исправление bugfixer, (текущая версия) :
Если после декорирования (mangling) у этих двух методов окажутся одинаковые имена - то будет конфликт имён.
Символы запросто могут быть weak. Всё правильно написали - по сути дела visibility это полу-легальный (в смысле я не помню чтобы в стандарте хоть слово об этом было) способ обойти ODR. Я потому сразу и написал что на выхлоп препроцессора смотреть надо - там сразу было бы видно откуда символ пришёл, и с какими атрибутами.
UPD
всё оказалось хуже, декорированные имена методов совпадают и компоновщик выкинул второй foo() заменив его вызовом первого foo() для второго класса.
Вот он - «ODR в действии».
Исходная версия bugfixer, :
Если после декорирования (mangling) у этих двух методов окажутся одинаковые имена - то будет конфликт имён.
Символы запросто могут быть weak. Всё правильно написали - по сути дела visibility это полу-легальный (в смысле я не помню чтобы в стандарте хоть слово об этом было) способ обойти ODR. Я потому сразу и написал что на выхлоп препроцессора смотреть надо - там сразу было бы видно откуда символ пришёл, и с какими атрибутами.