c++: dynamic_cast vs reinterpret_cast

Theodore Lytras thlytras at gmail.com
Thu Sep 13 22:57:11 EEST 2012


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

ΟΚ τελικά έλυσα το πρόβλημα ξεφεύγοντας από την πολλαπλή κληρονομικότητα με 
τον απλούστερο δυνατό τρόπο. Απορώ γιατί δε το σκέφτηκα νωρίτερα. Το γράφω 
μήπως και βοηθήσει τυχόν άλλους rookie C++ developers όπως εγώ:

Ο σχεδιασμός μου ήταν ο εξής: δύο abstract base classes ονόματι A και B, και 
πέντε concrete classes ονόματι X1,X2,X3,X4,X5. Και οι 5 κληρονομούν την Β, ενώ 
οι τρείς πρώτες (Χ1,Χ2,Χ3) κληρονομούν και την Α. Το ζήτημα ήταν οτι από ένα 
άλλο σημείο του κώδικα, χρειαζόμουν να μετατρέψω δείκτες Α* (δηλαδή δείκτες σε 
Χ1,Χ2 ή Χ3) σε Β.

Η λύση δε μου είχε περάσει από το μυαλό γιατί conceptually οι κλάσεις Α και Β 
δεν είχαν σχέση μεταξύ τους, υλοποιώντας διαφορετική λειτουργικότητα. Αφού 
όμως ότι είναι Α (δηλ. οι Χ1,Χ2 και Χ3) είναι ταυτόχρονα και Β, έβαλα το Α να 
κληρονομεί το Β, δηλαδή ως εξής:

Β --> Α --> Χ1, Χ2, Χ3
Β --------> Χ4, Χ5

με τις pure virtual methods της B να είναι pure virtual και στην Α και να 
υλοποιούνται στις Χ1, Χ2 και Χ3. Έτσι πλέον δε χρειάζεται dynamic_cast μεταξύ 
δύο άσχετων κλάσεων, αλλά static_cast (upcast) από Α στο γονικό Β.

Ευχαριστώ όλους στη λίστα - με τις απαντήσεις σας έγινα λιγάκι σοφότερος.

Θοδωρής


-- 
"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