c++: dynamic_cast vs reinterpret_cast

Tassos Bassoukos abas at isag.meng.auth.gr
Mon Sep 10 18:47:28 EEST 2012


On 09/10/2012 06:18 PM, Theodore Lytras wrote:
> Στις Δευ 10 Σεπτ 2012, ο/η John Tsiombikas έγραψε:
>> Nai... to dynamic_cast den einai cast, kanei extra malakies gia na
>> elenksei ti type exei ayto pou kaneis cast klp. To reinterpret_cast den
>> exei logo yparksis, just (cast) ...
> [snip, snip]
>>> Για να γίνω πιο συγκεκριμένος, έχω τις abstract base classes A και B, και
>>> μια σειρά concrete κλάσεων Χ1 έως Χ5. Οι Χ1, Χ2 και Χ3 κληρονομούν τόσο
>>> το A όσο και το B, ενώ οι Χ4 και X5 μόνο το Β. Ούτε η Α ούτε και η Β
>>> κληρονομούνται από άλλες κλάσεις.
>>>
>>> Αυτό που θέλω είναι να μετατρέψω δείκτες Α* σε δείκτες Β*. Φαντάζομαι
>>> αυτό μπορεί να γίνει τόσο με dynamic_cast όσο και με reinterpret_cast.
>>> Με ποιό από τα δύο λοιπόν θα πρέπει να το κάνω, και γιατί?
>> B *bptr = (B*)aptr;
>>
>> Seriously... ksexna ta whatever_casts<kourasi>(foo)... den yparxei logos
>> na kaneis ton kodika sou toso asximo.
> Να ανεβάσουμε λίγο τα stakes? Στην περίπτωση που περιέγραψα, προκύπτει οτι το
> dynamic_cast μου δουλεύει άψογα και σωστά ενώ τοσο το reinterpret_cast, όσο
> και τα C-style casts πετάνε segmentation fault σε κάποιο τυχαίο downstream
> σημείο του κώδικα.
>
> Και το καυτό ερώτημα είναι: αφού λειτουργεί κανονικά το dynamic_cast (και δεν
> επιστρέφει null pointer), σημαίνει οτι η μετατροπή από Α -> Β (του
> αντικειμένου μου Χ1 που κληρονομεί και από το Α και από το Β) είναι έγκυρη.
> Αφού είναι έγκυρη η μετατροπή, γιατί το reinterpret_cast να μη λειτουργεί?
>
> Όπως το αντιλαμβάνομαι εγώ: dynamic_cast = reinterpret_cast + runtime-check
>
> Άρα πως είναι δυνατόν το reinterpret_cast να μη λειτουργεί, και να λειτουργεί
> το dynamic_cast ??????
>
> Θοδωρής
>

Γιατί πολύ απλά, το in-memory layout ενός αντικειμένου μπορεί να είναι 
διαφορετικό από αυτο που έχουμε κατά νου, ιδιαίτερα δε εάν παίζουν 
περίεργα θέματα με inheritance. Ο αρχικός δείκτης μπορεί να δείχνει στην 
αρχή του αντικειμένου, αλλά ο δείκτης μετά από ένα dynamic_cast<> μπορεί 
να *μην* έχει την ίδια αριθμητική τιμή, και να δείχνει κάπου αλλού (ίσως 
μέσα στο αντικείμενο).

Undefined, UNdefined, unDefined.

Και για αυτό το λόγο έπαψα να ασχολούμαι με τη C++ - για να μάθω να τη 
δουλεύω καλά χρειάζομαι περίπου τόσο χρόνο όσο για να φτιάξω μια πιο 
λογική γλώσσα και έναν optimizing compiler...

Τάσος Μπασούκος



More information about the Linux-greek-users mailing list