You can parametrically plot the three dimensional vector $(f,g,c)$ sweeping out a two dimensional surface parametrized by c and d, with color dependent on d. If you have two such plots, you can combine them. One way to implement this is
p1 = ParametricPlot3D[{f1[x, y], g1[x, y], x}, {x, -10, 10}, {y, -20, 20}, ColorFunction -> (Hue[#5, 1/2, 1] &), BoxRatios -> {1, 1, 1}]
p2 = ParametricPlot3D[{f2[x, y], g2[x, y], x}, {x, -10, 10}, {y, -20, 20}, ColorFunction -> (Hue[#5, 1, 1] &), BoxRatios -> {1, 1, 1}];
Show[p1, p2]
where I just made some choice for the ranges etc. I use color in the form of Hue to label the value of my variable $y$ ($d$ for you), which is the fifth argument in the conventions for Colorfunction in ParametricPlot3D in Mathematica, hence the #5 in pure function notation. The second argument of Hue sets saturation, which I use to be able to visually distinguish between the two plots -- this way the one with half saturation one looks "dimmer". The Show command displays both graphs at the same time.
For illustration, I used
f1[x_, y_] := x + y
g1[x_, y_] := x/y
f2[x_, y_] := 2 x + y
g2[x_, y_] := x/y - 3
in the above code, to get
![result of Show[p1,p2]](https://i.stack.imgur.com/9f4jm.png)
Intersections you can try to determine either analytically or numerically, depending on the form of the functions $f$ and $g$, by hand or using other parts of Mathematica. Visually this is difficult in 4D, as you would need to make sure the colors are exactly matched as well.
ListContourPlot
to plotf[c,d]
with one style andg[c,d]
with another style. You do not need any fancy 3D plots for that. $\endgroup$ListPlot3D
tof
andg
$\endgroup$