Ποια είναι η ιδιαιτερότητα της κλήσης εικονικών μεθόδων μέσα στον κατασκευαστή μιας κλάσης;
sobes.tech AI
Απάντηση από AI
Όταν καλούνται εικονικές μέθοδοι μέσα στον κατασκευαστή μιας κλάσης σε C++, συμβαίνει μια ιδιαιτερότητα: οι εικονικές κλήσεις δεν λειτουργούν όπως συνήθως. Κατά την εκτέλεση του κατασκευαστή, ο πίνακας εικονικών (vtable) δείχνει στις μεθόδους της τρέχουσας κλάσης, όχι σε αυτές που έχουν υπερισχύσει στις κλάσεις που κληρονομούν.
Αυτό σημαίνει ότι αν μέσα στον κατασκευαστή της βασικής κλάσης καλέσετε μια εικονική μέθοδο, θα κληθεί ακριβώς η μέθοδος της βασικής κλάσης, ακόμα και αν έχει υπερισχύσει στην κλάση που κληρονομεί. Αυτό γίνεται για να αποτραπεί η κλήση μεθόδων που μπορεί να εξαρτώνται από μέρη του αντικειμένου που δεν έχουν ακόμη αρχικοποιηθεί.
Παράδειγμα:
class Base {
public:
Base() { foo(); }
virtual void foo() { std::cout << "Base::foo" << std::endl; }
};
class Derived : public Base {
public:
Derived() : Base() {}
void foo() override { std::cout << "Derived::foo" << std::endl; }
};
int main() {
Derived d; // Θα εμφανίσει "Base::foo", όχι "Derived::foo"
}
Επομένως, η κλήση εικονικών μεθόδων στους κατασκευαστές και τους καταστροφείς γίνεται πάντα στο πλαίσιο της τρέχουσας κλάσης, όχι της κλάσης που κληρονομεί.