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