Un par de conceptos rápidos.
Si una clase hereda de otra y tiene un método con el mismo nombre y diferentes parámetros, el método de la clase base no serña visible (salvo que se utilice un
using A::f; dentro de la clase hija)
Sin embargo, ese no es el problema aquí. Aquí el problema es que si D hereda de 2 clases que tienen 2 métodos con el mismo nombre, habrá ambigüedad aunque tengan diferentes parámetros. Para evitarlo, puedes escribir using para cada función:
using B::f;
using C::f;
En cualquier caso, salvo que vayas a heredar de una clase con funciones virtuales o salvo que quieras realmente eliminar la función de la base, mejor evitar tener métodos con el mismo nombre en diferentes clases de una herencia.