The real takeaway from the circle-ellipse problem is that mutators and conversion methods are inappropriate for use in inheritance. Essentially these operations (including stretching) are merely a more complicated form of class casting.
Perhaps the worst offender of this principle is the toString() method. A class designer must not suppose that the string representation he implements should be the canonical representation of that class. Instead, he should provide the user with accessors and iterators, and provide an external string conversion function which generates the strings from these methods.