Ответ 1
Не такая же проблема.
В исходной проблеме метод overriden можно вызвать из A. В вашей проблеме это не может быть так, потому что его не существует.
В проблеме с алмазом столкновение происходит, если класс A вызывает метод Foo. Обычно это не проблема. Но в классе D вы никогда не узнаете, какой экземпляр Foo нужно вызвать:
+--------+
| A |
| Foo |
| Bar |
+--------+
/ \
/ \
/ \
+--------+ +--------+
| B | | C |
| Foo | | Foo |
+--------+ +--------+
\ /
\ /
\ /
+--------+
| D |
| |
+--------+
В вашей проблеме нет общего предка, который может вызвать метод. На классе D есть два варианта Foo, на которые вы можете выбрать, но, по крайней мере, вы знаете, что их два. И вы можете сделать выбор между ними.
+--------+ +--------+
| B | | C |
| Foo | | Foo |
+--------+ +--------+
\ /
\ /
\ /
+--------+
| D |
| |
+--------+
Но, как всегда, вам не нужно многократное наследование. Вы можете использовать aggegration и интерфейсы для решения всех этих проблем.