c++: dynamic_cast vs reinterpret_cast

Theodore Lytras thlytras at gmail.com
Tue Sep 11 16:24:30 EEST 2012


Στις Τρι 11 Σεπτ 2012, ο/η Giorgos Keramidas έγραψε:
> > Αυτό που θέλω είναι να μετατρέψω δείκτες Α* σε δείκτες Β*. Φαντάζομαι
> > αυτό μπορεί να γίνει τόσο με dynamic_cast όσο και με reinterpret_cast.
> > Με ποιό από τα δύο λοιπόν θα πρέπει να το κάνω, και γιατί?
> 
> Να μην το κάνεις.
> 
> Αν δύο classes δεν έχουν grand-parent, parent, κλπ. σχέση, το
> dynamic_cast θα κάνει κάτι undefined και σίγουρα πολύ λάθος.
> 
> Ξανασκέψου γιατί θέλεις να μετατρέψεις ένα άσχετο class σε ένα άλλο,
> εντελώς άσχετο, class.
> 
> Μήπως τελικά αυτό που θέλεις είναι απλά ένα mixin class που υλοποιεί
> κάτι «κοινό» για τα class A και B;

OK, ευχαριστώ για την απάντηση, δυσκολεύτηκα λίγο με το memory layout αλλά 
νομίζω πως κατάλαβα.

Δεν είμαι σίγουρος όμως οτι έγινα εγώ σαφής στο τι θέλω να κάνω. Δε θέλω να 
μετατρέψω γενικά δείκτες Α σε δείκτες Β. Θέλω να μετατρέψω δείκτες Α που θα 
δείχνουν όμως σε αντικείμενο Χ (το οποίο κληρονομεί τόσο το Α όσο και το Β), 
σε Β. Γνωρίζω δηλαδή εκ των προτέρων οτι το αντικείμενο που μετατρέπω είναι 
έγκυρο αντικείμενο Α όσο και έγκυρο αντικείμενο Β.

Δε γνώριζα τι είναι mixin class, αλλά τώρα που το διάβασα είναι ακριβώς αυτό 
που έχω μπροστά μου. Τα Α και Β είναι τα mixin class μου (είναι abstract base 
classes, ορίζουν δηλαδή και pure virtual methods), που χρησιμοποιούνται από 
την κλάση Χ (για την ακρίβεια, σύνολο κλάσεων Χ1 έως Χ5). Δυστυχώς δε μπορώ να 
βρώ κάτι κοινό μεταξύ του Α και του Β. Κάνουν encapsulate διαφορετική 
λειτουργικότητα.

Υπό τις συνθήκες αυτές, είναι κακό να χρησιμοποιήσω το 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