Daniel's answer is the right one - it answers what your question should have asked!
But just for fun here's something closer to what your question actually asked.
f[a_,b_,c_] := a + b + c
g[f_, d_] := Catch[Module[{dv},
Check[dv = DownValues[f], Throw[$Failed], {DownValues::sym}];
Switch[Length[dv],
0, Print["No DownValues"]; $Failed,
1, dv[[1, 2]] + d,
_?(# > 1 &), Print["More than one DownValue - using the first!"];
dv[[1, 2]] + d,
_, Print["huh?!"]; $Failed]]]
test it:
In[3]:= g[f, d]
Out[3]= a + b + c + d
Define another function:
ff[a_, b_, c_] := a b c
In[5]:= g[ff, d]
Out[5]= a b c + d
and give it a second definition:
In[6]:= ff[a_, b_] := a + b
In[7]:= DownValues[ff]
Out[7]= {HoldPattern[ff[a_,b_,c_]] :> a b c, HoldPattern[ff[a_,b_]] :> a+b}
In[8]:= g[ff, d]
During evaluation of In[8]:= More than one DownValue - using the first!
Out[8]= a b c + d
Of course, the fact that you don't pass any arguements to f in g[f_,d_] will (in most cases) make this type of thing pretty pointless...