You have three obvious options.
Use overloads first so that the caller can choose bor not.
int myfunc(int a) { ... }
int myfunc(int a, base& b) { ... }
This way you can pass bwithout using a pointer. Note that you must make a breference or pointer type to avoid slicing the object.
-, , b , NULL.
int myfunc(int a, base* b = NULL) { ... }
-, -, nullable, boost::optional.
int myfunc(int a, boost::optional<base&> b = boost::optional<base&>()) { ... }