ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

Σχετικά έγγραφα
ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Οντοκεντρικός Προγραμματισμός

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Οντοκεντρικός Προγραμματισμός

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Προγραμματισμός Υπολογιστών με C++

Εισαγωγή στην πληροφορική

Εισαγωγή στην πληροφορική

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Προγραμματισμός Υπολογιστών με C++

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Αντικειμενοστρεφής Προγραμματισμός

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Τελεστές ΤΕΛΕΣΤΕΣ. Γεώργιος Παπαϊωάννου ( )

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Αντικειµενοστρεφής Προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΑΙ ΠΟΛΥΜΟΡΦΙΣΜΟΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Υπολογιστών με C++

Εισαγωγή στον Προγραμματισμό

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Βασικά Στοιχεία της Java

Διαδικασιακός Προγραμματισμός

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Γενικά (για τις γραπτές εξετάσεις)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Δομημένος Προγραμματισμός

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Προγραμματισμό για ΗΜΥ

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Αντικειμενοστραφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

Δεδομένα, Τύποι και Τιμές

3. Εκφράσεις και έλεγχος ροής

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Διάλεξη 5: Δείκτες και Συναρτήσεις

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Τύποι δεδομένων, τελεστές, μεταβλητές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στη γλώσσα προγραμματισμού C++

Ενδεικτικές Λύσεις σε Επιλεγμένα Θέματα της C++

Στοιχειώδης προγραμματισμός σε C++

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Κλάσεις και Αντικείµενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

3 Αλληλεπίδραση Αντικειμένων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Παίρνοντας Αποφάσεις 1

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Τελικό τεστ - απαντήσεις

Προχωρημένα Θέματα ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ. Γεώργιος Παπαϊωάννου ( )

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Εργαστήριο 10 Κλάσεις

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Συλλογές ΣΥΛΛΟΓΕΣ. Γεώργιος Παπαϊωάννου ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

Δεδομένα, τελεστές, είσοδος/έξοδος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Transcript:

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ Γεώργιος Παπαϊωάννου (2013-14) gepap@aueb.gr

Περιγραφή: Είδη καλουπωμάτων Μετατροπές και έλεγχοι τύπου Τελευταία ενημέρωση: Οκτώβριος 2013 Εισαγωγή - 2

Όπως και στη Java, στη C++ γίνεται έμμεση μετατροπή (implicit cast) βασικών τύπων (π.χ. int float) Γίνεται αυτόματα η άμεση μετατροπή κλάσεων σε οποιαδήποτε άλλη διαθέτει κατασκευαστή που παίρνει ως όρισμα την πρώτη Μπορούμε να αρχικοποιήσουμε στιγμιότυπα κλάσεων με άλλους τύπους (βλ. προϋποθέσεις παρακάτω) Π.χ. string str = abc // Το abc είναι const char [ ] Μπορούμε να μετατρέψουμε απευθείας μια κλάση στη βασική αυτής ή άλλο πρόγονο (up-casting), χωρίς καλούπωμα Π.χ. istream * stream = new ifstream( file.txt ); 3

Για να μπορούμε να πραγματοποιήσουμε μια μετατροπή: Δημιουργούμε έναν κατασκευαστή που παίρνει ως όρισμα τον τύπο της τιμής ανάθεσης Παράδειγμα: class A { float value; public: A(int val) { value = val; } }; A data = 13; // εδώ έχουμε προαγωγή τύπου // «ανάθεση τιμής» με κλήση του κατασκευαστή 4

Αν θέλουμε να απαγορεύσουμε την παραπάνω συμπεριφορά μιας κλάσης: Δηλώνουμε ως explicit τον κατασκευαστή Παράδειγμα: class A { public: }; float value; explicit A(int val) { } A data = 13; value = val; // ρητή δήλωση κατασκευαστή // ανάθεση με κλήση του explicit κατασκευαστή // απαγορεύεται. Σωστό: A data = A(13); 5

class rtresult { public: enum rt_result_code_t { RT_OK=0, RT_INVALID_PARAMS, RT_INVALID_OPERATION }; rt_result_code_t code = RT_OK; std::string message; rtresult() {}; rtresult(rt_result_code_t c, const std::string m = "") { message = m; code = c; } }; operator bool() const { return code == RT_OK; } 6

Μας επιτρέπουν να μετατρέψουμε εμείς ρητά μια κλάση σε κάποια άλλη ή κάποιο βασικό τύπο. Στο παράδειγμά μας, μπορώ να γράψω πλέον: rtresult res = ParseCommandLineArgs(); if (!res) { // εδώ μετατρέπουμε το αντικείμενο rtresult σε bool std::cout << res.message; return; } 7

Υπάρχει και ισχύει Είναι κι αυτό explicit cast και μάλιστα: Επιτρέπει μετατροπή σε συμβατούς βασικούς τύπους Επιτρέπει μετατροπή σε κλάσεις ίδιου επιπέδου ή προγόνους (αλλά προφανώς δε χρειάζεται) Δεν επιτρέπει άμεση μετατροπή σε απόγονο down-casting (εκτός κι αν υπάρχει κατάλληλος κατασκευαστής, τον οποίο και καλεί) Προσοχή: Επιτρέπει μετατροπή από οποιονδήποτε δείκτη σε οποιονδήποτε άλλο χωρίς έλεγχο! Αν δεν πρέπει να γίνει η μετατροπή, ο compiler δε θα βγάλει σφάλμα! 8

class Bottle { private: float volume; public: Bottle(float vol): volume(vol) {}; const float getvolume() {return volume;} }; class SmallBottle : public Bottle { public: SmallBottle() : Bottle(1.0f) {} }; int main() { Bottle bottle = Bottle(2.0f); SmallBottle bs = (SmallBottle)bottle; // Down-casting: Απαγορεύεται. Δεν // υπάρχει κατασκευαστής που να παίρνει // όρισμα Bottle SmallBottle * p_bs = (SmallBottle *) &bottle; // Επιτρέπεται! Μπορεί να return 0; // προκαλέσει σοβαρά run-time } // σφάλματα 9

Ναι, στη C++ υπάρχουν άλλες 4 μορφές καλουπώματος, όχι μόνο 1! Διαφέρουν στο επίπεδο που σέβονται ή παρακάμπτουν την κληρονομικότητα Κάποια αφορούν ειδικές μετατροπές Διαφέρουν στην αλγοριθμική πολυπλοκότητά τους Έχουμε: static_cast const_cast dynamic_cast reinterpret_cast 10

Δήλωση: static_cast<return_type> ( expression ) Επιτρέπει τη μετατροπή δεικτών σε κλάσεις και προς τα κάτω στην κληρονομική αλυσίδα (down-casting) Αντιγράφει τα κοινά πεδία Δεν εξασφαλίζει τι γίνεται με τα επιπρόσθετα πεδία Δεν ελέγχει 11

class Bottle { private: float volume; public: Bottle(float vol): volume(vol) {}; const float getvolume() {return volume;} const bool operator< (const Bottle & right) const {return volume<right.volume;} }; class SmallBottle : public Bottle { public: string label; SmallBottle() : Bottle(1.0f), label("bell") {} };... Bottle bottle = Bottle(2.0f); SmallBottle bs = * static_cast<smallbottle*>(&bottle); // Δε βγάζει compile error, όμως: // Κατά την αντιγραφή του αντικειμένου (default copy constructor) // πάει να αντιγράψει το label από μνήμη εκτός του αντικειμένου (δεν υπάρχει) // στην κλάση Bottle! Access Violation 12

Δήλωση: dynamic_cast<return_type> ( expression ) Κάνει ασφαλή μετατροπή, όπου γίνεται, μεταξύ δεικτών πολυμορφικών τύπων, ακόμα και με πολλαπλή κληρονομικότητα Χρησιμοποιεί το RTTI (Run-Time Type Information) των κλάσεων, γι αυτό, πρέπει να υπάρχει πολυμορφική μορφή στην expression: Πρέπει να έχει δηλωθεί τουλάχιστον μια μέθοδος ως virtual Αν αποτύχει η μετατροπή, επιστρέφεται 0 (nullptr) Σημείωση: το dynamic_cast είναι αργό σε σχέση με τα υπόλοιπα καλουπώματα 13

Το dynamic_cast αντιστοιχεί με ένα συνδυασμό instanceof της Java συν την τελική μετατροπή στον τύπο ελέγχου Οπότε μπορούμε να φτιάξουμε μια αντίστοιχη συνάρτηση της instanceof: #define instanceof(a,b) ( dynamic_cast<b*>(&a)==nullptr? \\ false : true ) 14

#define instanceof(a,b) ( dynamic_cast<b*>(&a)==nullptr? false:true ) class Bottle { private: float volume; public: Bottle(float vol): volume(vol) {}; virtual const float getvolume() {return volume;} const bool operator< (const Bottle & right) const {return volume<right.volume;} };... SmallBottle bottle = SmallBottle(); bool dc = instanceof(bottle,bottle); // true 15

Δήλωση: const_cast<return_type> ( expression ) Το const_cast χρησιμοποιείται για να «επιβάλει» ή να «αναιρέσει» το const από μια μεταβλητή, συνήθως κατά την ανάθεσή ή τη χρήση της ως όρισμα Χρήσιμο όταν περνάμε ορίσματα που διαφέρουν μόνο ως προς το const και ξέρουμε ότι δεν θα επηρεάσει το casting τη λειτουργία των συναρτήσεων 16

Δήλωση: reinterpret_cast<return_type> ( expression ) Το πιο «ισχυρό» cast operation Αγνοεί παντελώς τους τύπους που πρόκειται να μετατραπούν! Βλέπει το expression σαν ένα block μνήμης το οποίο και το «βαφτίζει» ως κάτι άλλο Ουσιαστικά μας επιτρέπει να δούμε οτιδήποτε ως οποιονδήποτε τύπο! Προφανώς είναι επικίνδυνη η χρήση του! Αλλά ταυτόχρονα χρήσιμη (βλ. συνέχεια) 17

Το reinterpret_cast ενδέχεται να μας χρειαστεί όταν πρέπει να περάσουμε δεδομένα γνωστού τύπου ως ορίσματα που είναι αυστηρά προσδιορισμένα αλλιώς Παράδειγμα: Έστω ότι έχουμε μια συνάρτηση που χειρίζεται events και που παίρνει 2 ορίσματα: Τον τύπο του event Tα δεδομένα του event Επειδή το τι είναι τα δεδομένα εξαρτάται από το είδος του μηνύματος, αυτό το γνωρίζουμε μόνο κατά την εκτέλεση Όμως, αν μας έρθει ένας τύπος μηνύματος, τότε σίγουρα ξέρουμε τον τύπο των δεδομένων και μπορούμε να κάνουμε άμεσα τη μετατροπή: 18

void processmessage( unsigned int msg_type, void * msg_data ) { switch (msg_type) { case EVENT_MOUSE_DOWN: case EVENT_MOUSE_UP: MouseData * data = reinterpret_cast<mousedata *> (msg_data); data->... break; case EVENT_WINDOW_CLOSE: Window * wnd = reinterpret_cast<window *> (msg_data); wnd->... break;... } } 19

float fa[] = {1.0f, 2.0f, 3.0f, 4.0f}; double * da = reinterpret_cast<double*>(fa); cout << da[0] << " " << da[1] << " " << da[2] << " " << da[3]; // τυπώνει: 2 512-9.25596e+061-9.25596e+061 Διότι: fa[4] da[4] 00 00 80 3F 00 00 00 40 00 00 40 40 00 00 80 40 1.0f 2.0f 3.0f 4.0f 2 512???? 20

Όταν υλοποιούμε πρωτόκολλα πάνω από χαμηλού επιπέδου κανάλια μεταφοράς (streams από bytes), π.χ. sockets: Εμείς διαβάζουμε μια ακολουθία από bytes Οργανώνουμε τα bytes se ομάδες ίσες με το sizeof() της δομής που ξέρουμε ότι μας έρχεται Εκτελούμε ένα reinterpret_cast πάνω τους ώστε να τα δούμε ως τον τύπο που περιμένουμε να λάβουμε 21

Ο compiler δημιουργεί επιπρόσθετη πληροφορία για τις κλάσεις και ανά στιγμιότυπο (RTTI run-time type information) ώστε να: Μπορεί να αποφαίνεται για τον ακριβή τύπο μιας κλάσης Αυτό γίνεται με τον built-in τελεστή typeid: Bottle * bs = new SmallBottle(); cout << typeid(bs).name(); // τυπώνει class Bottle * cout << typeid(*bs).name(); // τυπώνει class SmallBottle cout << (typeid(bottle)==typeid(*bs)); // Μπορώ να ζητήσω τον τύπο // της κλάσης και του instance // αυτής. Ισχύει ο τελεστής == 22

Προσοχή: Στο παραπάνω παράδειγμα, ο έλεγχος (typeid(bottle)==typeid(*bs)) δίνει αποτέλεσμα false, καθώς ο ακριβής τύπος των δύο κλάσεων διαφέρει Δεν εξετάζεται η κληρονομικότητα. Έλεγχο κληρονομικότητας κάνουμε με dynamic_cast<>(). 23