C++ Virtual Constructor

C Virtual Constructor



Η C++ δεν μας διευκολύνει στην κατασκευή εικονικών κατασκευαστών καθώς δεν είναι δυνατό να παρακάμψουμε τον κατασκευαστή της κλάσης. Έτσι, η εικονικοποίηση κατασκευαστή δεν έχει νόημα. Δεν υπάρχει ιδέα δημιουργίας εικονικού κατασκευαστή σε ένα πρόγραμμα C++, αλλά μπορεί να δημιουργήσουμε τον εικονικό καταστροφέα εκεί. Μπορούμε επίσης να το ορίσουμε αφού ο προγραμματισμός ενός κατασκευαστή στη C++ δεν μπορεί να θεωρηθεί εικονικός επειδή όταν καλείται ο κατασκευαστής μιας κλάσης, η μνήμη δεν περιέχει εικονικό πίνακα που να υποδεικνύει ότι δεν δημιουργείται εικονικός δείκτης. Έτσι, ο κατασκευαστής θα πρέπει να είναι μη εικονικός ανά πάσα στιγμή.

Ωστόσο, θα μπορούσε να υπάρχει ένας εικονικός καταστροφέας. Εδώ, θα δείξουμε τι συμβαίνει όταν δημιουργούμε έναν εικονικό κατασκευαστή στη C++ καθώς και τη λειτουργία του εικονικού καταστροφέα αντί του εικονικού κατασκευαστή.

Παράδειγμα 1:

Ας δημιουργήσουμε τον εικονικό κατασκευαστή και ας ξεκινήσουμε τον κώδικά μας τοποθετώντας το αρχείο κεφαλίδας «iostream». Αυτό το αρχείο κεφαλίδας είναι για τις συναρτήσεις που δηλώνονται σε αυτό όπως 'cin' και 'cout'. Μετά από αυτό, προσθέτουμε τον χώρο ονομάτων 'std', οπότε δεν μπορούμε να προσθέσουμε αυτό το 'std' με κάθε συνάρτηση στον κώδικά μας. Μετά από αυτό, δημιουργούμε μια κλάση που είναι η βασική κλάση του κώδικά μας με το όνομα 'my_base' και στη συνέχεια προσθέτουμε το 'public' για να δημιουργήσουμε τον εικονικό κατασκευαστή.







Ο εικονικός κατασκευαστής δημιουργείται εδώ τοποθετώντας την «εικονική» λέξη-κλειδί. Μέσα σε αυτόν τον εικονικό κατασκευαστή, τοποθετούμε μια δήλωση 'cout'. Κάτω από αυτό, δημιουργούμε μια συνάρτηση με το όνομα 'show' στην οποία χρησιμοποιούμε ξανά το 'cout'. Μετά από αυτό, δημιουργούμε μια παράγωγη κλάση αυτής της βασικής κλάσης με το όνομα 'my_derived' και στη συνέχεια εγκαθιστούμε τον κατασκευαστή 'my_derived()' στο πεδίο 'δημόσιο'. Εισάγουμε μια πρόταση 'cout' σε αυτόν τον κατασκευαστή 'my_derived()'. Κάτω από αυτό, κατασκευάζουμε μια συνάρτηση που ονομάζεται 'show' όπου χρησιμοποιούμε το 'cout' για άλλη μια φορά.



Τώρα, αφού καλέσουμε την “main()”, δημιουργούμε έναν δείκτη της βασικής κλάσης με το όνομα “my_ptr” και επίσης δημιουργούμε το αντικείμενο της παραγόμενης κλάσης που είναι “Obj_d”. Μετά από αυτό, εκχωρούμε τη διεύθυνση του 'Obj_d' στο 'my_ptr'. Στη συνέχεια, καλούμε τη συνάρτηση 'show()' μέσω του 'my_ptr'.



Κωδικός 1:





#include
χρησιμοποιώντας χώρο ονομάτων std ;
τάξη my_base
{
δημόσιο :
εικονικός my_base ( )
{
cout << 'Εδώ είναι η βασική μου τάξη' << endl ;
}
κενός προβολή ( )
{
cout << 'η συνάρτηση εμφάνισης της βασικής κλάσης' << endl ;
}
} ;
τάξη my_derived : δημόσιο my_base
{
δημόσιο :
my_derived ( )
{
cout << 'Εδώ είναι η παράγωγη τάξη μου' << endl ;
}
κενός προβολή ( )
{
cout << 'η συνάρτηση εμφάνισης της παραγόμενης κλάσης' < προβολή ( ) ;
}

Παραγωγή:
Εδώ, εμφανίζει ένα μήνυμα σφάλματος που λέει ότι ο κατασκευαστής δεν μπορεί να δηλωθεί ως εικονικός στον προγραμματισμό της C++. Έτσι, μπορούμε να δούμε ότι η C++ δεν μας επιτρέπει να δημιουργήσουμε τον εικονικό κατασκευαστή, αλλά μπορεί να δημιουργήσουμε τον εικονικό καταστροφέα.



Παράδειγμα 2:

Ας λύσουμε το προηγούμενο πρόβλημα και ας δημιουργήσουμε τον εικονικό καταστροφέα σε αυτόν τον κώδικα. Αφού δηλώσουμε την κλάση 'new_base', τοποθετούμε τον κατασκευαστή 'public' στον οποίο δημιουργούμε τον εικονικό καταστροφέα προσθέτοντας το 'virtual ~' με το 'new_base'. Εισάγουμε μια δήλωση 'cout' σε αυτόν τον εικονικό καταστροφέα. Κάτω από αυτό, κατασκευάζουμε μια συνάρτηση που ονομάζεται 'show' που χρησιμοποιεί το 'cout'. Στη συνέχεια, φτιάχνουμε μια παράγωγη κλάση που είναι 'new_derived' αυτής της βασικής κλάσης 'new_base' και κατασκευάζουμε τον καταστροφέα 'new_derived()' στο πεδίο 'δημόσιο'. Αυτός ο καταστροφέας 'new_derived()' έχει τώρα προστεθεί μια δήλωση 'cout'.

Κάτω από αυτό, δημιουργούμε μια συνάρτηση που ονομάζεται 'show' που χρησιμοποιεί ξανά τη δήλωση 'cout'. Αφού καλέσουμε τη συνάρτηση «main()», παράγουμε τώρα ένα αντικείμενο της παραγόμενης κλάσης «obj_d» καθώς και έναν δείκτη της βασικής κλάσης με το όνομα «ptr1». Μετά από αυτό, δίνουμε τη διεύθυνση 'obj_d' στο 'ptr1'. Στη συνέχεια, η μέθοδος 'show()' καλείται χρησιμοποιώντας 'ptr1'.

Κωδικός 2:

#include
χρησιμοποιώντας χώρο ονομάτων std ;
τάξη new_base
{
δημόσιο :
εικονικός ~new_base ( )
{
cout << 'Ο καταστροφέας της βασικής κατηγορίας είναι εδώ' << endl ;
}
κενός προβολή ( )
{
cout << 'Η συνάρτηση εμφάνισης της βασικής κλάσης' << endl ;
}
} ;
τάξη νέο_προερχόμενο : δημόσιο new_base
{
δημόσιο :
~new_proved ( )
{
cout << 'Ο παράγωγος καταστροφέας τάξης είναι εδώ' << endl ;
}
κενός προβολή ( )
{
cout << 'Η συνάρτηση εμφάνισης της βασικής κλάσης' < προβολή ( ) ;
}

Παραγωγή:
Αυτό το πρόγραμμα χρησιμοποιεί ένα αντικείμενο δείκτη της 'new_base' που δείχνει στην προκύπτουσα κλάση 'obj_d'. Έτσι, καλεί πρώτα τη μέθοδο 'show()' της κλάσης 'new_base'. Στη συνέχεια, καλεί τη μέθοδο '~new_derived()' της κλάσης 'new_derived' και εμφανίζει το '~new_base' της βασικής κλάσης.

Παράδειγμα 3:

Εδώ είναι ένας άλλος κώδικας για τη δημιουργία του 'εικονικού' κατασκευαστή. Αφού συμπεριλάβουμε το 'iostream' και τον χώρο ονομάτων 'std', δημιουργούμε μια κλάση 'B'. Κάτω από αυτό, δημιουργούμε τον κατασκευαστή 'public' που είναι 'B()' και στη συνέχεια δημιουργούμε το 'cout'. Οι συναρτήσεις κατασκευαστή και καταστροφέας ορίζονται χρησιμοποιώντας έναν προσδιοριστή «δημόσιας» πρόσβασης στον οποίο μπορεί να καλέσει οποιοδήποτε αντικείμενο της κλάσης.

Τώρα, δημιουργούμε επίσης τον καταστροφέα '~B()' αυτής της βασικής κλάσης στον οποίο χρησιμοποιούμε ξανά το 'cout'. Στη συνέχεια, δημιουργούμε την κλάση «D» που είναι η παράγωγη κλάση της βασικής κλάσης «Β» και τοποθετούμε το «δημόσιο» εδώ. Μέσα σε αυτό το «κοινό», δημιουργούμε τον κατασκευαστή καθώς και τον καταστροφέα της παραγόμενης κλάσης με τα ονόματα «D()» και «~D», αντίστοιχα. Και τα δύο περιέχουν το 'cout' μέσα τους. Τώρα, έχουμε τη συνάρτηση 'main()'. Αφού καλέσουμε αυτή τη συνάρτηση, δημιουργούμε το αντικείμενο δείκτη της βασικής κλάσης.

Στη συνέχεια, χρησιμοποιούμε τη λέξη-κλειδί 'διαγραφή' και τοποθετούμε εδώ το 'base_ptr'. Σε αυτήν την περίπτωση, ο χώρος του καταστροφέα διαγράφεται καλώντας το αντικείμενο δείκτη της βασικής κλάσης.

Κωδικός 3:

#include
χρησιμοποιώντας χώρο ονομάτων std ;
τάξη σι
{
δημόσιο :
σι ( )
{
cout << 'Κατασκευαστής της βασικής τάξης' << endl ;
}
~ Β ( )
{
cout << 'Καταστροφέας της βασικής τάξης' << endl ;
}
} ;

τάξη ρε : δημόσιο σι
{
δημόσιο :
ρε ( )
{
cout << 'Κατασκευαστής της παραγόμενης τάξης' << endl ;
}
( )
{
cout << 'Καταστροφέας της παραγόμενης τάξης' << endl ;
}
} ;
ενθ κύριος ( )
{
σι * βάση_ptr = νέος ρε ;
διαγράφω βάση_ptr ;
}

Παραγωγή:
Το αποτέλεσμα δείχνει ότι χρησιμοποιεί ένα αντικείμενο δείκτη που δείχνει την κλάση 'B' στην κύρια συνάρτηση. Έτσι, καλεί πρώτα τον 'constructor()' της κλάσης 'B'. Στη συνέχεια, καλεί τον 'constructor()' της κλάσης 'D'. Στη συνέχεια διαγράφεται το αντικείμενο δείκτη που διατηρούν οι καταστροφείς των κλάσεων 'B' και 'D'. Χωρίς την επίκληση του καταστροφέα της κλάσης «D» μέσα στο πρόγραμμα, ο δείκτης κλάσης «Β» εξαλείφει μόνο τον καταστροφέα της κλάσης «Β». Ως αποτέλεσμα, η μνήμη του προγράμματος είναι κατεστραμμένη.

συμπέρασμα

Συζητήσαμε την έννοια της «Εικονικής κατασκευής» στον προγραμματισμό C++. Εξερευνήσαμε ότι δεν μπορούμε να δημιουργήσουμε τον εικονικό κατασκευαστή στη C++, αλλά μπορεί να δημιουργήσουμε τον εικονικό καταστροφέα στους κώδικές μας. Εδώ, δείξαμε τι συνέβη όταν δημιουργήσαμε τον εικονικό κατασκευαστή στον προγραμματισμό C++ και τη λειτουργία του εικονικού καταστροφέα στους κώδικές μας. Μάθαμε ότι ο κατασκευαστής δεν μπορεί να είναι εικονικός, αλλά μπορούμε να δημιουργήσουμε τον εικονικό καταστροφέα στην τάξη μας. Δείξαμε μερικά παραδείγματα και εξηγήσαμε διεξοδικά αυτούς τους κωδικούς σε αυτόν τον οδηγό.