c++: dynamic_cast vs reinterpret_cast

Theodore Lytras thlytras at gmail.com
Mon Sep 10 18:18:31 EEST 2012


Στις Δευ 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 ??????

Θοδωρής

-- 
"Beauty is transitory."
"Beauty survives."
        --  Mr. Spock & Capt. Kirk, "That Which Survives", stardate unknown
by Theodore Lytras <thlytras at gmail.com>


More information about the Linux-greek-users mailing list