2016-09-16 1 views
0

Ich lerne C++ und liest ein Buch, eine Tour von C++.Vector der virtuellen Klasse in C++

In Abschnitt 9.2.1, dieses Buch sagt

vector<Shape> vs;    # is bad, 
vector<Shape*> vps;    # is better, and 
vector<unique_ptr<Shape>> vups; # is OK. 

Meine Frage ist, warum "Vektor <Form> vs;" wird nicht akzeptiert, und "Vektor < unique_ptr <Form> > vups;" ist das Beste? Könnten Sie das klären?

Shape-Klasse ist hier eine virtuelle Klasse. In einem vorherigen Kapitel wurden Circle-Klasse und Triangle-Klasse als von Shape abgeleitet definiert. Kreisklassenobjekt und Dreiecksklassenobjekt sollen im Container gespeichert werden.

Antwort

1

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.

Verwandte Themen