¿Por qué las funciones heredadas múltiples con el mismo nombre pero con firmas diferentes no se tratan como funciones sobrecargadas?

El siguiente fragmento produce un error de "llamada ambigua a foo" durante la compilación, y me gustaría saber si hay alguna forma de evitar este problema sin calificar completamente la llamada a foo:

#include <iostream>

struct Base1{
    void foo(int){
    }
};

struct Base2{
    void foo(float){
    }
};

struct Derived : public Base1, public Base2{
};

int main(){
    Derived d;
    d.foo(5);

    std::cin.get();
    return 0;
}

Entonces, la pregunta es como dice el título. Ideas? Quiero decir, lo siguiente funciona perfectamente:

#include <iostream>

struct Base{
    void foo(int){
    }
};

struct Derived : public Base{
    void foo(float){
    }
};

int main(){
    Derived d;
    d.foo(5);

    std::cin.get();
    return 0;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta