Because your object o ISN'T an object of type Derived. What you're trying to do would result in an object in an undefined state. Of course, you could write your own type conversion operator, to return a properly-constructed object of type Derived, if you like.