#include #include class Base { public: virtual void info() { std::cout << "Είμαι η Base" << std::endl; } virtual ~Base() {} // Πάντα virtual destructor στη βασική κλάση }; class Derived : public Base { private: int array[10000]; public: void info() override { std::cout << "Είμαι η Derived" << std::endl; } void special_function() { array[9999] = 1; std::cout << "Ειδική λειτουργία της Derived!" << std::endl; } }; int main() { Derived* d = new Derived(); // 1. Upcasting: Από Derived* σε Base* (Πάντα ασφαλές) // Γίνεται και αυτόματα, το static_cast το κάνει explicit. Base* b = static_cast(d); b->info(); // 2. Downcasting: Από Base* σε Derived* // Εδώ το static_cast εμπιστεύεται τον προγραμματιστή. // Αν το 'b' όντως δείχνει σε Derived, όλα καλά. Αν όχι, θα υπήρχε πρόβλημα Derived* d2 = static_cast(b); d2->special_function(); Base* real_base = new Base(); // Ο compiler επιτρέψει τη μετατροπη Base* -> Derived*. // H d3 θα δείχνει σε αντικείμεν τύπου Base Derived* d3 = static_cast(real_base); d3->special_function(); // ΚΙΝΔΥΝΟΣ: Runtime Crash delete d; delete real_base; return 0; }