Q:

what is the ill effect to upcast to a base-class object instead of a reference?

I can't find the answer easily so would like to get your opinion:
class Child : public Parent { 
  int i; 
  Member m; 
public: 
  Child(int ii) : Parent(ii), i(ii), m(ii) { 
    cout << "Child(int ii)\n"; 
  } 
  friend ostream& 
    operator<<(ostream& os, const Child& c){ 
    return os << (Parent&)c << c.m 
          << "Child: " << c.i << endl; 
  } 
}; 

The comment about the following code piece is "if you cast to a base-class object instead of a reference you will usually get undesirable results"
return os << (Parent&)c << c.m 

I wonder why?

A:

Casting to a reference to the base class provides a "view" of your derived object. You can only access to its base part through that reference, though it will behave polymorphically (virtual methods will still forward to their derived implementation).
Casting to the base class' type itself will create a temporary, independent instance of said base class, which is copied from the base part of your derived object. It might indeed be what you intend, but pretty rarely so : that new object will die immediately unless you bind it to a suitable reference :
Base const &b = (Base)derived;
Base &&b = (Base)derived;

Otherwise, either you don't care about the temporary object, and you could as well have accessed your derived object directly through a Base&, or you truly wish to slice off a copy and could use the natural syntax :
Base b = derived;

