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

C++ query


afnman

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

Εχω δει σε καμποσα 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?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

  • Δημιουργία νέου...