e is inherited from b & d, so there's b version of f() and d version of f().
It is very logical that there's an ambiguity.
If you want class e to use d version of f(), there are two ways,
call d::f() directly in the call
instance_e.d::f(); //will call d::f().
redeclare d::f() in e
class e : public b, public d { public : using d::f; }
I don't get why you mention constructor here, the order of contruction has no influence to the function f().