Προς το περιεχόμενο

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • 0
afnman

C++ query

Ερώτηση

Εχω δει σε καμποσα progs αυτο το πραγμα

>
class SmthingElse
{
public: 
void DoSmthing(){ ....}
}
class Smthing
{ 
   private:  virtual SmthingElse* OnGet(){ return NULL;}
  public:
        void DoThis()
          {
                SmthingElse *Think=OnGet();

                   Think->DoSmthing();
         }
}

main()
{
    Smthing stuff;
     stuff.DoThis();
}

Δεν καταλαβαινω πως λειτουργει αυτο το και ποιο το νοημα του. H OnGet γυριζει NULL αρα ο pointer Thing ειναι NULL. Γιατι εκτελειτε η DoSmthing?? (η οποια μαλιστα γραφει τιμές στα privates της SmthingElse.) Δεσμευει μνήμη αυτο το πράγμα; Η Mηπως απλα ο compiler της συμπεριφέρεται σαν να ήταν inline?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

2 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

Είναι virtual, άρα ο compiler δεν πρέπει να κάνει inlining. Μάλλον δηλώνεται έτσι με σκοπό να γίνει override η OnGet() από κάποιον απόγονο, και το NULL είναι απλά η default συμπεριφορά.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

H DoSmthing εκτελείται επειδή δεν είναι virtual. Ο compiler αντικαθιστά το Think->DoSmthing() με κλήση της SmthingElse::DoSmthing(SmthingElse* this_ptr) . Σαν όρισμα δηλαδή περνάει τη διεύθυνση Think που εδώ είναι NULL. Αν η DoSmthing δεν προσπαθήσει να προσπελάσει μη στατικά μέλη, τότε δεν υπάρχει πρόβλημα. Συμπεριφέρεται δηλαδή σαν μια στατική συνάρτηση της SmthingElse.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...