Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann Object Slicing beim Arbeiten mit Vektoren von Vererbungshierarchien in C vermieden werden?

DDD
Freigeben: 2024-11-01 09:00:03
Original
859 Leute haben es durchsucht

How Can Object Slicing Be Avoided When Working with Vectors of Inheritance Hierarchies in C  ?

Vektoren und Polymorphismus in C: Object Slicing enträtselt

Beim Umgang mit Vektoren von Vererbungshierarchien in C kann man auf subtile Feinheiten stoßen, die das können beabsichtigtes Verhalten behindern. Betrachten Sie das folgende Beispiel:

<code class="cpp">class Instruction
{
public:
    virtual void execute() {  }
};

class Add: public Instruction
{
private:
    int a;
    int b;
    int c;
public:
    Add(int x, int y, int z) {a=x;b=y;c=z;}
    void execute() { a = b + c;  }
};</code>
Nach dem Login kopieren

Stellen Sie sich nun vor, ein Add-Objekt in einem Vektor von Basisklassenzeigern zu speichern:

<code class="cpp">void some_method()
{
    vector<Instruction*> v;
    Instruction* i = new Add(1,2,3)
    v.push_back(i);
}</code>
Nach dem Login kopieren

Später versuchen wir in einer separaten Methode, das aufzurufen Ausführungsfunktion für das letzte Element des Vektors:

<code class="cpp">void some_other_method()
{
    Instruction ins = v.back();
    ins.execute();
}</code>
Nach dem Login kopieren

Ein häufiges Missverständnis ist, dass sich die Ausführungsfunktion so verhält, als ob sie für ein Add-Objekt aufgerufen würde. Dies ist jedoch nicht der Fall.

Das Problem ergibt sich aus der Art und Weise, wie Vektoren Werte speichern: Sie speichern Kopien von Objekten, keine Referenzen. Wenn das Add-Objekt in den Vektor verschoben wird, wird es daher kopiert, was zu einem Objekt vom Typ „Instruction“ führt und die Add-spezifischen Daten und Methoden verliert. Dies wird als Objekt-Slicing bezeichnet.

Um Objekt-Slicing zu vermeiden, müssen wir unseren Vektor so ändern, dass er Referenzen anstelle von Kopien enthält:

<code class="cpp">vector<Instruction*> ins</code>
Nach dem Login kopieren

Alternativ können wir std::reference_wrapper verwenden:

<code class="cpp">vector< std::reference_wrapper<Instruction> > ins</code>
Nach dem Login kopieren

Durch die Verwendung von Referenzen behalten wir den ursprünglichen Typ des Objekts innerhalb des Vektors bei und ermöglichen so das erwartete polymorphe Verhalten.

Das obige ist der detaillierte Inhalt vonWie kann Object Slicing beim Arbeiten mit Vektoren von Vererbungshierarchien in C vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!