Child::init is now concealing Father::init and not overriding it.
In order to receive dynamic dispatch, your init member function must be virtual:
virtual void init () {
cout << "I'm the father" << endl;
};
Optionally, you could mark Child::init as override to be explicit that you want to override a virtual function (requires C++11):
void init () override {
cout << "I'm the child" << endl;
};