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