Πώς να καλέσετε την overriden λειτουργία της γονικής κλάσης σε C ++;

ψήφοι
-1

Το αναμενόμενο αποτέλεσμα:

Child = 2
Parent = 1

κωδικός μου:

class Parent{
    int a;
    public:
        void display(){
            a = 1;
            cout << Parent =  << a << endl;
        }
};

class Child:public Parent{
    int b;
    public:
        void display(){
            b = 2;
            cout << Child =  << b << endl;
        }
};

int main()
{
    Parent *p = new Child();
    Child c;

    //write your code here
    /* My solution :
      c.display();
      Parent* a = &c;
      a->display();
    */


}

Έκανα χρήση των στατικών σύνδεση με καλέσει με επιτυχία τη λειτουργία του μέλους της οθόνης () της μητρικής τάξης

Ωστόσο, αναρωτιέμαι αν υπάρχει κάποια καλύτερη λύση για αυτό το ζήτημα.

Ποιος είναι ο σκοπός της ύπαρξης αυτής της γραμμής Parent *p = new Child();; Είναι ένας δείκτης που δείχνει σε ένα κατασκευαστή;

Ποια είναι η διαφορά μεταξύ της εν λόγω γραμμής και Parent *p = new Child;;

Δημοσιεύθηκε 09/10/2019 στις 18:49
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
2

Υπάρχουν πολλά σημεία για να κάνετε εδώ:

  1. ChildΔεν είναι επιτακτικό τίποτα, κρύβεται μόνο τη μέθοδο της βασικής κλάσης. Προέχοντες θα απαιτούσε virtualσυναρτήσεις-μέλη, και μπορείτε να επιβεβαιώσετε ότι η μέθοδος παρακάμπτει ουσιαστικά μια συνάρτηση βάσης τάξη με την προσθήκη του overrideλέξη-κλειδί. Ούτε τάξη είναι πολυμορφικό, επειδή δεν υπάρχουν εικονικές μεθόδους πουθενά.

  2. Από τις τάξεις σας δεν είναι πολυμορφικοί, θα έχετε μόνο ποτέ στατική δεσμευτική, δεν δυναμικής δέσμευσης. (Θα αναγνωριστεί σωστά αυτό συμβαίνει).

  3. Για να καλέσετε μια συνάρτηση βάσης τάξη που είχε παρακαμφθεί ή κρυμμένα σε μια παραγόμενη κλάση, μπορείτε πρόθεμα την κλήση με το όνομα βάση την κατηγορία και ::, όπως έτσι:

    class Child : public Parent{
      int b;
      public:
        void display(){
          Parent::display();
        }
    };
    
    // or
    
    int main()
    {
      Child c;
      c.Parent::display();
    }
    
  4. Δεν υπάρχει διαφορά μεταξύ της Parent *p = new Child();και Parent *p = new Child;τον κωδικό σας, τόσο καλέσετε τον κατασκευαστή προεπιλογή για να προετοιμάσει ένα νέο παιδί αντικειμένου. Για τους τύπους, όπως intυπάρχει μια διαφορά, new int;δημιουργεί μια προετοιμαστεί intαντικειμένου, new int();new int{};) αρχικοποιεί το στο μηδέν αντ 'αυτού.

Απαντήθηκε 09/10/2019 στις 18:59
πηγή χρήστη

ψήφοι
1

Πώς να καλέσετε την overriden λειτουργία της γονικής κλάσης σε C ++;

Δεν έχετε πραγματικά παρακαμφθεί οποιαδήποτε λειτουργία στο παράδειγμά σας. Μόνο οι λειτουργίες εικονικό μέλος μπορεί να παρακαμφθεί, και displayδεν είναι εικονική.

Έκανα χρήση των στατικών σύνδεση με καλέσει με επιτυχία τη λειτουργία του μέλους της οθόνης () της μητρικής τάξης

Η λύση σας λειτουργεί επειδή δεν υπάρχει υπέρτερο ή εικονικές λειτουργίες που εμπλέκονται. Ένας άλλος τρόπος για να καλέσετε την κρυμμένη συνάρτηση-μέλος είναι να χρησιμοποιήσετε τον τελεστή ψήφισμα πεδίο:

c.Parent::display();

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


Ποιος είναι ο σκοπός της ύπαρξης αυτής της γραμμής Parent *p = new Child();;

Επίσης, δεν φαίνεται να έχει κανένα σκοπό στο πρόγραμμά σας. Σε γενικές γραμμές, newχρησιμοποιείται για την εκχώρηση αντικειμένων δυναμικά από την ελεύθερη κατάστημα.

Είναι ένας δείκτης που δείχνει σε ένα κατασκευαστή;

Όχι pσημεία της δυναμικής αντικείμενο που δημιουργήθηκε στην ελεύθερη αποθήκη.

Ποια είναι η διαφορά μεταξύ της εν λόγω γραμμής και Parent *p = new Child;;

Χωρίς παρενθέσεις, μπορείτε να χρησιμοποιήσετε τη σύνταξη προεπιλογή εκκίνησης. με παρενθέσεις που χρησιμοποιείτε εκκίνησης αξία.

Απαντήθηκε 09/10/2019 στις 19:02
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more