It is probably worth mentioning that the standard containers (and in general, any mutable container) cannot be covariant in their element type without compromising soundness. A vector&lt;Circle•&gt; should not have a push_back(Shape•) member function inherited from vector&lt;Shape•&gt;. (However, a vector&lt;Circle•&gt; could be safely <i>copied</i> to a vector&lt;Shape•&gt; via an implicit conversion.) Java arrays infamously covary, leading to dreaded ArrayStoreExceptions if misused.<p>(Edit: any way to write literal asterisks in HN?)