fx(int) and fx() are two different functions, therefore child::fx is not reimplementing base::fx. Default parameters are simply a conveinience thing, and can't be used to change the behavior of the underlying function.
If you want to mimic that behavior you can do the following:
1 2 3 4 5 6
struct child:
public base
{
virtualvoid fx() { fx(1); /* call the other function instead of a default param*/ }
virtualvoid fx(int i) {cout << "child fx with i == " << i << "." << endl;}
};