Sobes.tech
Middle

Ποιες δύο λειτουργίες μπορούν να χρησιμοποιηθούν σε C++ για τον προσδιορισμό των τύπων κατά την εκτέλεση του προγράμματος;

sobes.tech AI

Απάντηση από AI

typeid και dynamic_cast.

  • typeid: Επιστρέφει ένα αντικείμενο std::type_info, που περιέχει πληροφορίες σχετικά με τον τύπο της έκφρασης.

    #include <iostream>
    #include <typeinfo>
    
    class Base {};
    class Derived : public Base {};
    
    int main() {
        Base* b = new Derived();
        std::cout << typeid(*b).name() << std::endl; // Θα εμφανίσει το όνομα του τύπου Derived (ή ένα mangled όνομα)
        delete b;
        return 0;
    }
    
  • dynamic_cast: Χρησιμοποιείται για ασφαλείς μετατροπές τύπων σε ιεραρχίες κλάσεων. Αν η μετατροπή δεν είναι δυνατή, επιστρέφει nullptr για δείκτες ή ρίχνει εξαίρεση std::bad_cast για αναφορές. Η επιτυχής μετατροπή συνεπάγεται ότι ο τύπος του αντικειμένου κατά την εκτέλεση ταιριάζει με τον στόχο ή κληρονομεί από αυτόν.

    #include <iostream>
    #include <typeinfo>
    
    class Base { public: virtual ~Base() {} }; // Απαιτείται πολυμορφικός τύπος
    class Derived : public Base {};
    class Other {};
    
    int main() {
        Base* b = new Derived();
        Derived* d = dynamic_cast<Derived*>(b); // Επιτυχής μετατροπή
        if (d) {
            std::cout << "Μετατροπή σε Derived επιτυχής" << std::endl;
        }
    
        Other* o = dynamic_cast<Other*>(b); // Αποτυχημένη μετατροπή
        if (!o) {
            std::cout << "Μετατροπή σε Other αποτυχημένη" << std::endl;
        }
    
        delete b;
        return 0;
    }
    

Για να λειτουργούν σωστά τα typeid και dynamic_cast με δείκτες και αναφορές σε κλάσεις, η κλάση πρέπει να είναι πολυμορφική, δηλαδή να περιέχει τουλάχιστον μια εικονική συνάρτηση. Συνήθως, προστίθεται εικοντικός καταστροφέας για αυτό το σκοπό.