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 με δείκτες και αναφορές σε κλάσεις, η κλάση πρέπει να είναι πολυμορφική, δηλαδή να περιέχει τουλάχιστον μια εικονική συνάρτηση. Συνήθως, προστίθεται εικοντικός καταστροφέας για αυτό το σκοπό.