Der Container vector
besitzt jedes Objekt darin und baut das Objekt speziell so auf, dass es Teil des Vektors wird. Da Sie keinen Shape
konstruieren können, um in den Vektor zu gehen, gibt es keine Möglichkeit, std::vector<Shape>
zu verwenden. Versuchen Sie, ein Objekt in diesen Vektor einzufügen. Dies ist nicht möglich.
Auf der anderen Seite kann ein Zeiger auf eine Instanz einer Klasse abgeleitet von Shape
in eine Shape*
konvertiert werden, und Sie können Zeiger ohne Probleme kopieren. So ist es in Ordnung:
vector<Shape*> vps;
vps.insert(new Circle());
Ähnlich unique_ptr
s polymorph sind. So können Sie eine unique_ptr<Shape>
konstruieren, die auf eine Instanz einer von Shape
abgeleiteten Klasse zeigt.
Aber es gibt keine Möglichkeit, eine Shape
, die eine Instanz einer Klasse abgeleitet von Shape
ist. Also vector<Shape>
ist ein Nicht-Starter.
Eine andere Möglichkeit, es zu sehen, ist zu sehen, welchen Raum der Vektor zuweisen wird. Für einen Vektor von Shape*
wird es genug Platz reservieren, um eine Shape*
zu halten, und das kann einen Zeiger auf eine Instanz einer Klasse halten, die von Shape
abgeleitet wird, kein Problem.
Für einen Vektor von unique_ptr<Shape>
, dass genügend Platz zuteilen wird ein unique_ptr<Shape>
, zu halten, und dass ein eindeutigen Zeiger auf ein Shape
halten kann, die von Shape
, ohne Problem abgeleitet auf eine Klasse verweist.
Aber was passiert mit vector<Shape>
. Das reserviert genug Platz, um eine Shape
zu halten. Aber was können wir damit machen, wenn wir versuchen, eine von Shape
abgeleitete Klasse zu speichern? Mit diesem Raum können wir gar nichts anfangen! Instanzen von abgeleiteten Klassen sind typischerweise größer als Instanzen ihrer Basisklassen, sodass ein solcher Vektor für uns wiederum nutzlos wäre.