Vermeidet die Weitergabe als Referenz immer das Problem mit dem Slicen?

7

Das hat mich ein wenig überrascht, aber ich habe mit etwas Code herumgespielt und herausgefunden, dass zumindest auf meinem Computer, wenn eine Funktion eine Elternklasse als Referenz annimmt und Sie eine Kindinstanz übergeben, das Slicing-Problem nicht auftritt komme nicht vor. Zur Veranschaulichung:

%Vor%

Dies gibt Child::DoSomething aus.

Wie ich schon sagte, war ich ein wenig überrascht. Ich meine, ich weiß, dass das Vorübergehen wie ist, indem ich die Zeiger herumreiße (aber viel sicherer in meinem Verständnis), aber ich wusste nicht, dass ich dabei polymorphe Güte behalten muss.

>

Ich will nur sicher gehen, soll das geschehen oder ist es einer der "es funktioniert auf meiner Maschine" Art von Instanzen?

    
Anthony 26.11.2011, 13:30
quelle

4 Antworten

9

Das Verhalten, das Sie sehen, ist korrekt. So soll es funktionieren. Referenzen funktionieren genau wie Zeiger.

    
trenki 26.11.2011, 13:34
quelle
11

"Slicing" bezieht sich auf die Unfähigkeit des Basiskopierkonstruktors, exakte Typübereinstimmungen von abgeleiteten Klassen zu unterscheiden. Die einzige Möglichkeit zum Aufrufen von Slicing besteht darin, den Basiskopiekonstruktor aufzurufen. In der Regel tritt dies auf, wenn Argumente nach Wert übergeben werden, obwohl auch andere Situationen denkbar sind:

%Vor%

Du machst so etwas nie, so dass du keine Schnittsituationen hast.

    
Kerrek SB 26.11.2011 13:49
quelle
3

Das soll passieren. Durch Verweis zu gehen ist GENAU wie das Übergeben von Zeigern - es macht dasselbe unter der Haube. Das ist keine Zauberei; Für jede Instanz eines polymorphen Objekts ist eine virtuelle Funktionstabelle zugeordnet. Solange Sie nichts kopieren, werden Sie diese Informationen nicht verlieren und Ihre virtuellen Funktionsaufrufe funktionieren so, wie Sie es erwarten.

Der Grund dafür, dass Sie bei der Übergabe von Wert auf Probleme stoßen, ist, dass er den Kopierkonstruktor des Typs verwendet, den Sie in der Funktionssignatur angegeben haben, sodass Sie eine völlig neue Instanz der Superklasse erhalten.

    
Nathan Monteleone 26.11.2011 13:39
quelle
2

Ja, die Bindung an eine Referenz ermöglicht eine dynamische Bindung. Dies wird durch den Unterschied zwischen dem dynamischen Typ eines Objekts und seinem statischen Typ verursacht.

Wenn Sie Ihren Parameter nach Wert nehmen, wird er zu einer Parent -Klasse. Wenn Sie etwas durch eine Referenz oder einen Zeiger übergeben und eine virtuelle Funktion aufrufen, sucht die Laufzeit nach dem dynamic type oder most-derived type des tatsächlichen Objekts, auf das verwiesen wird.

    
pmr 26.11.2011 13:33
quelle