<iostream> includes <istream> and <ostream>.
<fstream> includes <ifstream> and <ofstream>.
As for why an object of iostream can reference an object of fstream, this is because <ifstream> and <ofstream> are derived from <istream> and <ostream> respective, as has been pointed out by Timon Paßlick:
fstream extends iostream.
Now, <iostream> cannot replace <fstream> because a base class does not contain all the members of the derived class.
Similarly, <fstream> cannot replace <iostream> because some members of the base class cannot be invoked by an object of the derived class.