Slicingproblem



  • Mich würde mal das technische interessieren, ich habe 2 Klassen

    class Base
    {
    public:
        // Get und Set für 'x'
    private:
       int x;
    };
    
    class Derived : public Base
    {
    public:
       // Get und Set für 'y'
    private:
       int y;
    };
    
    void funktion(Base& obj) {
        // Base kann nicht auf derived-felder zu greifen
    }
    

    Bei 'funktion' wird das das Baseobjekt abgeschnitten, für immer?
    Also was passiert da genau? Verliert man da die Speicheradressen? Oder sind sie einfach nicht zugänglich?

    Wenn die 'funktion' jetzt aufgerufen wurde und ihre Aufgabe erledigt hat, habe ich dann den Wert von 'y' verloren und kann nie wieder auf das 'y' zu greifen?

    diese unwissenheit quält mich 😞



  • Da wird gar nichts abgeschnitten. Das ist lediglich eine Übergabe per Referenz. Die Funktion kann nicht wissen, ob es noch mehr hinter Base gibt, aber es ist und bleibt da bis du wieder weisst, ob es was gibt (z.B über einen Cast).

    Abgeschnitten wird lediglich, wenn du das jetzt per Kopie übergibst, weil dann wird das Objekt kopiert und natürlich lediglich der Teil, welcher auch sicher ankommt. Es ändert aber nichts am ursprünglichen Objekt.



  • drakon schrieb:

    Da wird gar nichts abgeschnitten. Das ist lediglich eine Übergabe per Referenz. Die Funktion kann nicht wissen, ob es noch mehr hinter Base gibt, aber es ist und bleibt da bis du wieder weisst, ob es was gibt (z.B über einen Cast).

    Also wenn es wieder zum 'Derived' kommt habe ich mein geliebtes 'y' wieder und darf darauf zu greifen so oft ich will.

    Danke 🤡



  • Hallo JustAsking,

    Bei 'funktion' wird das das Baseobjekt abgeschnitten, für immer?
    Also was passiert da genau?Verliert man da die Speicheradressen?

    Der Compiler garantiert erstmal das die Objekte,
    die 'funktion' erhält min. vom Typ base sind, sie können auch mehr enthalten.

    Tatsächlich wird hier im speziellen mit Referenzen gearbeitet
    und schon alleine deshalb nichts 'weggelassen'.

    Interessant wird es eigentlich erst wenn es keine Referenz wäre,
    das Objekt also kopiert werden muss.
    Das Objekt wird vollständig kopiert.
    Ich bin mir aber nicht sicher ob es nicht auch Fälle gibt wo das nicht so ist.

    Oder sind sie einfach nicht zugänglich?

    Wenn du 'funktion' ein 'Derived' Objekt erhalten würde kann 'funktion' erstmal
    nur auf das Base Interface zugreifen, alles ander verhindert der Compiler.
    Es ist aber auch möglich mit dynamic_cast 'hochzucasten',
    dann kann man ggf. auch auf derivered zuzugreifen.
    Andere casts sind an diesen Stellen nicht zu empfehlen ...

    Gruß Frank



  • Genau. Die Frage ist eher, ob es eine gute Idee ist ob es nötig ist wieder dazu zu kommen. 😉



  • Hallo Drakon,

    "Das Objekt wird vollständig kopiert.
    Ich bin mir aber nicht sicher ob es nicht auch Fälle gibt wo das nicht so ist."

    Bist du sicher, daß das bei einer Kopie nur das BASE Objekt kopiert würde?
    Ich würde das gerne wissen und bin mir unsicher.

    Danke Gruß Frank



  • Naja. Es gibt sicher Fälle, wo deine Aussage zutrifft, z.B wenn das Basisobjekt gar keine Daten enthält.
    Ansonsten macht es überhaupt keinen Sinn, dass noch etwas mehr kopiert wird (wohin denn auch?!).



  • Danke Drakon,

    wohin denn auch?!

    Ist die richtige Frage,

    Es darf nicht mehr auf den Stack kopiert werden.
    hätte ich selbst drauf kommen können ...

    Gruß Frank


Anmelden zum Antworten