C++ Πολυμορφισμός με Παράδειγμα

⚡ Έξυπνη Σύνοψη

Πολυμορφισμός σε C++ επιτρέπει σε μια συνάρτηση ενός μέλους να λάβει πολλές μορφές, συμπεριφερόμενη διαφορετικά ανάλογα με το αντικείμενο που την καλεί. Βασίζεται στην κληρονομικότητα και εμφανίζεται σε δύο τύπους, οι οποίοι επιλύονται είτε κατά τον χρόνο μεταγλώττισης είτε κατά τον χρόνο εκτέλεσης.

  • 🔷 Ορισμός: Πολυμορφισμός σημαίνει «πολλές μορφές», επιτρέποντας σε μια συνάρτηση-μέλος να συμπεριφέρεται διαφορετικά με βάση το αντικείμενο που την καλεί.
  • 🧭 Δύο τύποι: C++ Παρέχει πολυμορφισμό κατά τη μεταγλώττιση (στατικό) και πολυμορφισμό κατά την εκτέλεση (δυναμικό).
  • 🧩 Χρόνος μεταγλώττισης: Η υπερφόρτωση συνάρτησης και η υπερφόρτωση τελεστή επιλέγουν τη σωστή συνάρτηση κατά τη μεταγλώττιση.
  • 🔁 Χρόνος εκτέλεσης: Οι συναρτήσεις παράκαμψης συνάρτησης και οι εικονικές συναρτήσεις επιλύουν την κλήση ενώ το πρόγραμμα εκτελείται.
  • ⚙️ Εικονικές λειτουργίες: Η εικονική λέξη-κλειδί σε μια βασική κλάση επιτρέπει την καθυστερημένη σύνδεση μέσω ενός δείκτη βασικής κλάσης.
  • 🤖 Βοήθεια AI: Το GitHub Copilot και παρόμοιοι βοηθοί δημιουργούν ικρίωμα υπερφορτωμένων, παρακαμφθέντων και εικονικών συναρτήσεων από ένα σύντομο σχόλιο.

C++ Πολυμορφισμός

Σε τι είναι ο Πολυμορφισμός C++?

In C++, ο πολυμορφισμός προκαλεί μια συνάρτηση-μέλος να συμπεριφέρεται διαφορετικά με βάση το αντικείμενο που την καλεί/επικαλείται. Ο πολυμορφισμός είναι μια ελληνική λέξη που σημαίνει να έχεις πολλές μορφές. Εμφανίζεται όταν έχετε μια ιεραρχία από τάξεις σχετίζονται μέσω κληρονομικότητας.

Για παράδειγμα, ας υποθέσουμε ότι έχουμε τη συνάρτηση makeSound(). Όταν μια γάτα καλεί αυτή τη λειτουργία, θα παράγει τον ήχο νιαουρίσματος. Όταν μια αγελάδα επικαλείται την ίδια λειτουργία, θα δώσει τον ήχο κούρασης.

Πολυμορφισμός σε C++ παράδειγμα makeSound

Αν και έχουμε μία λειτουργία, αυτή συμπεριφέρεται διαφορετικά υπό διαφορετικές συνθήκες. Η συνάρτηση έχει πολλές μορφές. Ως εκ τούτου, έχουμε επιτύχει πολυμορφισμό.

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

Τύποι πολυμορφισμού

C++ υποστηρίζει δύο τύπους πολυμορφισμού:

  • Πολυμορφισμός χρόνου μεταγλώττισης, και
  • Πολυμορφισμός χρόνου εκτέλεσης.

Τύποι πολυμορφισμού σε C++

Η πρώτη κατηγορία επιλύει κάθε κλήση συνάρτησης πριν καν εκτελεστεί το πρόγραμμα.

Σύνταξη Χρονικού Πολυμορφισμού

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

Ο πολυμορφισμός χρόνου μεταγλώττισης επιτυγχάνεται μέσω υπερφόρτωσης συναρτήσεων και υπερφόρτωσης χειριστή.

Λειτουργία Υπερφόρτωση

Η υπερφόρτωση συναρτήσεων συμβαίνει όταν έχουμε πολλές συναρτήσεις με παρόμοια ονόματα αλλά διαφορετικά ορίσματα. Τα ορίσματα μπορεί να διαφέρουν ως προς τον αριθμό ή τον τύπο.

Παράδειγμα 1

#include <iostream> 
using namespace std;

void test(int i) {
	cout << " The int is " << i << endl;
}
void test(double  f) {
	cout << " The float is " << f << endl;
}
void test(char const *ch) {
	cout << " The char* is " << ch << endl;
}

int main() {
	test(5);
	test(5.5);
	test("five");
	return 0;
}

Παραγωγή:

C++ Υπερφόρτωση συνάρτησης Παράδειγμα 1 έξοδος

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

C++ Υπερφόρτωση συνάρτησης Παράδειγμα 1 κώδικας

Code Επεξήγηση:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικά μας. Θα μπορούμε να χρησιμοποιήσουμε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας. Θα μπορούμε να χρησιμοποιήσουμε τις τάξεις του χωρίς να το καλέσουμε.
  3. Δημιουργήστε μια συνάρτηση με το όνομα test που λαμβάνει μια ακέραια παράμετρο i. Το { σηματοδοτεί την αρχή της δοκιμής του σώματος της λειτουργίας.
  4. Δήλωση που πρέπει να εκτελεστεί εάν κληθεί/κληθεί η παραπάνω δοκιμή συνάρτησης.
  5. Τέλος του σώματος του παραπάνω λειτουργικού τεστ.
  6. Δημιουργήστε μια συνάρτηση με το όνομα test που λαμβάνει μια παράμετρο float f. Το { σηματοδοτεί την αρχή της δοκιμής του σώματος της λειτουργίας.
  7. Δήλωση που πρέπει να εκτελεστεί εάν κληθεί/κληθεί η παραπάνω δοκιμή συνάρτησης.
  8. Τέλος του σώματος του παραπάνω τεστ λειτουργίας.
  9. Δημιουργήστε μια συνάρτηση με το όνομα test που λαμβάνει μια παράμετρο χαρακτήρα κεφ. Το { σηματοδοτεί την αρχή της δοκιμής του σώματος της λειτουργίας.
  10. Δήλωση που πρέπει να εκτελεστεί εάν κληθεί/κληθεί η παραπάνω δοκιμή συνάρτησης.
  11. Τέλος του σώματος του παραπάνω τεστ λειτουργίας.
  12. Καλέστε τη συνάρτηση main(). Το { σηματοδοτεί την αρχή του σώματος της συνάρτησης.
  13. Καλέστε τη δοκιμή συνάρτησης και περνώντας της το 5 ως τιμή του ορίσματος. Αυτό καλεί τη συνάρτηση δοκιμής που δέχεται ένα ακέραιο όρισμα, δηλαδή την πρώτη δοκιμαστική συνάρτηση.
  14. Καλέστε τη δοκιμή συνάρτησης και περάστε την 5.5 ως τιμή του ορίσματος. Αυτό θα ενεργοποιήσει τη συνάρτηση δοκιμής που δέχεται ένα όρισμα float, δηλαδή τη δεύτερη συνάρτηση δοκιμής.
  15. Καλέστε τη δοκιμή συνάρτησης και περάστε πέντε σε αυτήν ως τιμή του ορίσματος. Αυτό θα ενεργοποιήσει τη συνάρτηση δοκιμής που δέχεται ένα όρισμα χαρακτήρα, δηλαδή την τρίτη συνάρτηση δοκιμής.
  16. Το πρόγραμμα πρέπει να επιστρέψει μια τιμή εάν εκτελείται με επιτυχία.
  17. Το τέλος του σώματος της συνάρτησης main().

Έχουμε τρεις συναρτήσεις με το ίδιο όνομα αλλά διαφορετικούς τύπους ορισμάτων. Έχουμε πετύχει πολυμορφισμό.

Operator Υπερφόρτωση

In Operator Υπερφόρτωση, ορίζουμε μια νέα σημασία για το α C++ χειριστήςΑλλάζει επίσης τον τρόπο λειτουργίας του τελεστή. Για παράδειγμα, μπορούμε να ορίσουμε τον τελεστή + για να συνενώσουμε δύο συμβολοσειρές. Τον γνωρίζουμε ως τελεστή πρόσθεσης για την πρόσθεση αριθμητικών τιμών. Μετά τον ορισμό μας, όταν τοποθετείται ανάμεσα σε ακέραιους αριθμούς, θα τους προσθέσει. Όταν τοποθετείται ανάμεσα σε συμβολοσειρές, θα τους συνενώσει.

Παράδειγμα 2

#include<iostream> 
using namespace std;

class ComplexNum {
private:
	int real, over;
public:
	ComplexNum(int rl = 0, int ov = 0) {
		real = rl;   
		over = ov; 
	}

	ComplexNum operator + (ComplexNum const &obj) {
		ComplexNum result;
		result.real = real + obj.real;
		result.over = over + obj.over;
		return result;
	}
	void print() { 
		cout << real << " + i" << over << endl; 
	}
};
int main()
{
	ComplexNum c1(10, 2), c2(3, 7);
	ComplexNum c3 = c1+c2;
	c3.print();
}

Παραγωγή:

C++ Υπερφόρτωση τελεστή Παράδειγμα 2 έξοδος

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

C++ Υπερφόρτωση τελεστή Παράδειγμα 2 κώδικας

C++ Υπερφόρτωση χειριστή Παράδειγμα 2 αποτέλεσμα

Code Επεξήγηση:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  3. Δημιουργήστε μια κλάση με το όνομα ComplexNum. Το { σηματοδοτεί την αρχή του σώματος της τάξης.
  4. Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης για να επισημάνετε τις μεταβλητές ως ιδιωτικές, που σημαίνει ότι μπορούν να προσπελαστούν μόνο μέσα από την κλάση.
  5. Ορίστε δύο ακέραιες μεταβλητές, πραγματικές και πάνω.
  6. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε τον κατασκευαστή ως δημόσιο, που σημαίνει ότι θα είναι προσβάσιμος ακόμη και εκτός της κλάσης.
  7. Δημιουργήστε τον κατασκευαστή κλάσης και αρχικοποιήστε τις μεταβλητές.
  8. Αρχικοποιήστε την τιμή της μεταβλητής real.
  9. Αρχικοποιήστε την τιμή της μεταβλητής over.
  10. Τέλος του σώματος του κατασκευαστή.
  11. Πρέπει να παρακάμψουμε την έννοια του τελεστή +.
  12. Δημιουργήστε το αποτέλεσμα τύπου δεδομένων τύπου ComplexNum.
  13. Χρησιμοποιήστε τον τελεστή + με μιγαδικούς αριθμούς. Αυτή η γραμμή θα προσθέσει το πραγματικό μέρος ενός αριθμού στο πραγματικό μέρος ενός άλλου αριθμού.
  14. Χρησιμοποιήστε τον τελεστή + με μιγαδικούς αριθμούς. Αυτή η γραμμή θα προσθέσει το φανταστικό μέρος ενός αριθμού στο φανταστικό μέρος ενός άλλου αριθμού.
  15. Το πρόγραμμα θα επιστρέψει την τιμή του αποτελέσματος της μεταβλητής μετά την επιτυχή εκτέλεση.
  16. Τέλος του ορισμού της νέας έννοιας του + τελεστή, δηλαδή υπερφόρτωση.
  17. Καλέστε τη μέθοδο print().
  18. Εκτυπώστε τον νέο μιγαδικό αριθμό μετά την προσθήκη στην κονσόλα.
  19. Τέλος του σώματος της συνάρτησης print().
  20. Τέλος του σώματος της κλάσης ComplexNum.
  21. Καλέστε τη συνάρτηση main().
  22. Περάστε τις τιμές τόσο των πραγματικών όσο και των μιγαδικών μερών που θα προστεθούν. Το πρώτο μέρος του c1 θα προστεθεί στο πρώτο μέρος του c2, δηλαδή 10+3. Το δεύτερο μέρος του c1 θα προστεθεί στο δεύτερο μέρος του c, δηλαδή 2+7.
  23. Εκτελέστε μια λειτουργία χρησιμοποιώντας τον τελεστή overloaded + και αποθηκεύοντας το αποτέλεσμα στη μεταβλητή c3.
  24. Εκτυπώστε την τιμή της μεταβλητής c3 στην κονσόλα.
  25. Τέλος του σώματος της συνάρτησης main().

Όπου ο πολυμορφισμός κατά τον χρόνο μεταγλώττισης αποφασίζει νωρίς, η δεύτερη κατηγορία αναβάλλει την επιλογή μέχρι την εκτέλεση.

Πολυμορφισμός χρόνου εκτέλεσης

Αυτό συμβαίνει όταν η μέθοδος ενός αντικειμένου καλείται/καλείται κατά τη διάρκεια του χρόνου εκτέλεσης και όχι κατά τη διάρκεια του χρόνου μεταγλώττισης. Ο πολυμορφισμός χρόνου εκτέλεσης επιτυγχάνεται μέσω της παράκαμψης συναρτήσεων. Η συνάρτηση που θα κληθεί/κληθεί καθιερώνεται κατά τη διάρκεια του χρόνου εκτέλεσης.

Παράκαμψη συνάρτησης

Η παράκαμψη συνάρτησης συμβαίνει όταν μια συνάρτηση της βασικής κλάσης λαμβάνει έναν νέο ορισμό σε μια παράγωγη κλάση. Εκείνη τη στιγμή, μπορούμε να πούμε ότι η βασική συνάρτηση έχει παρακαμφθεί.

Για παράδειγμα:

#include <iostream>
using namespace std;
class Mammal {

public:
	void eat() {

		cout << "Mammals eat...";
	}

};

class Cow: public Mammal {

public:
	void eat() {

		cout << "Cows eat grass...";
	}
};
int main(void) {

	Cow c = Cow();

	c.eat();

	return 0;

}

Παραγωγή:

C++ συνάρτηση που υπερισχύει της εξόδου

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

C++ κώδικας παράκαμψης συνάρτησης

Code Επεξήγηση:

  1. Εισαγάγετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα Mammal. Το { σηματοδοτεί την αρχή του σώματος της τάξης.
  4. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να ορίσετε τη συνάρτηση που πρόκειται να δημιουργήσουμε ως δημόσια προσβάσιμη. Θα είναι προσβάσιμο εκτός αυτής της τάξης.
  5. Δημιουργήστε μια δημόσια λειτουργία με το όνομα eat. Το { σηματοδοτεί την αρχή του σώματος συνάρτησης.
  6. Εκτυπώστε τη δήλωση που προστέθηκε στη συνάρτηση cout όταν καλείται η συνάρτηση eat().
  7. Το τέλος του σώματος της συνάρτησης eat().
  8. Τέλος του σώματος της τάξης Θηλαστικού.
  9. Δημιουργήστε μια τάξη με το όνομα Cow που κληρονομεί την κατηγορία Mammal. Η αγελάδα είναι η παραγόμενη τάξη, ενώ το Θηλαστικό είναι η βασική κατηγορία. Το { σηματοδοτεί την αρχή αυτής της τάξης.
  10. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε τη συνάρτηση που πρόκειται να δημιουργήσουμε ως δημόσια προσβάσιμη. Θα είναι προσβάσιμο εκτός αυτής της τάξης.
  11. Παράκαμψη της συνάρτησης eat() που ορίστηκε στη βασική κλάση. Το { σηματοδοτεί την αρχή του σώματος συνάρτησης.
  12. Η δήλωση για εκτύπωση στην κονσόλα όταν καλείται αυτή η λειτουργία.
  13. Τέλος του σώματος της συνάρτησης eat().
  14. Τέλος του σώματος της τάξης Αγελάδα.
  15. Καλέστε τη συνάρτηση main(). Το { σηματοδοτεί την αρχή του σώματος αυτής της συνάρτησης.
  16. Δημιουργήστε ένα στιγμιότυπο της κλάσης Cow και δώστε της το όνομα c.
  17. Καλέστε τη συνάρτηση eat() που ορίζεται στην κλάση Cow.
  18. Το πρόγραμμα πρέπει να επιστρέψει μια τιμή μετά την επιτυχή ολοκλήρωση.
  19. Τέλος της συνάρτησης main().

C++ Εικονική λειτουργία

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

Εάν μια κλάση εικονικής συνάρτησης κληρονομηθεί, η εικονική κλάση επαναπροσδιορίζει την εικονική συνάρτηση για να ταιριάζει στις ανάγκες της. Για παράδειγμα:

#include <iostream>  
using namespace std;
class ClassA {
		public:
		virtual void show() {
			cout << "The show() function in base class invoked..." << endl;
		}
	};
	class ClassB :public ClassA {
	public:
		void show() 	{
			cout << "The show() function in derived class invoked...";
		}
	};
	int main() {
		ClassA* a;   
		ClassB b;
		a = &b;
		a->show();      
	}

Παραγωγή:

C++ έξοδος εικονικής συνάρτησης

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

C++ εικονικός κώδικας συνάρτησης

Code Επεξήγηση:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικα για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα ClassA.
  4. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε ένα μέλος της τάξης ως δημόσια προσβάσιμο.
  5. Δημιουργήστε μια εικονική συνάρτηση με το όνομα show(). Θα είναι δημόσια λειτουργία.
  6. Το κείμενο που πρέπει να εκτυπωθεί όταν καλείται η show() που επικαλείται. Το endl είναι α C++ λέξη-κλειδί, που σημαίνει τελική γραμμή. Μετακινεί τον κέρσορα του ποντικιού στην επόμενη γραμμή.
  7. Τέλος του σώματος της εικονικής συνάρτησης show().
  8. Τέλος του σώματος της τάξης ClassA.
  9. Δημιουργία μιας νέας κλάσης με το όνομα ClassB που κληρονομεί την κλάση ClassA. Η ClassA γίνεται η βασική κλάση ενώ η ClassB η παραγόμενη κλάση.
  10. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε ένα μέλος της τάξης ως δημόσια προσβάσιμο.
  11. Επαναπροσδιορίστε την εικονική συνάρτηση show() που προέρχεται από τη βασική κλάση.
  12. Το κείμενο που θα εκτυπωθεί στην κονσόλα όταν καλείται η συνάρτηση show() που ορίζεται στην παράγωγη κλάση.
  13. Τέλος του σώματος της συνάρτησης show().
  14. Τέλος του σώματος της παραγόμενης κλάσης, ClassB.
  15. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα του.
  16. Δημιουργήστε μια μεταβλητή δείκτη με το όνομα a. Δείχνει την κλάση με το όνομα ClassA.
  17. Δημιουργήστε ένα στιγμιότυπο της κλάσης με το όνομα ClassB. Στο παράδειγμα δίνεται το όνομα β.
  18. Αντιστοιχίστε τις τιμές που αποθηκεύονται στη διεύθυνση b στη μεταβλητή a.
  19. Καλέστε τη συνάρτηση show() που ορίζεται στην παράγωγη κλάση. Έχει εφαρμοστεί καθυστερημένη δέσμευση.
  20. Τέλος του σώματος της συνάρτησης main().

Με καλυμμένους και τους δύο μηχανισμούς, ο παρακάτω πίνακας τους αντιπαραβάλλει.

Compile-Time Polymorphism Vs. Πολυμορφισμός χρόνου εκτέλεσης

Εδώ είναι οι κύριες διαφορές μεταξύ των δύο:

Πολυμορφισμός μεταγλώττισης Πολυμορφισμός χρόνου εκτέλεσης
Ονομάζεται επίσης πρώιμος δεσμός ή στατικός πολυμορφισμός. Ονομάζεται επίσης όψιμη/δυναμική σύνδεση ή δυναμικός πολυμορφισμός.
Η μέθοδος καλείται/καλείται κατά τη διάρκεια του χρόνου μεταγλώττισης Η μέθοδος καλείται/καλείται κατά τη διάρκεια του χρόνου εκτέλεσης
Υλοποιείται μέσω υπερφόρτωσης λειτουργίας και υπερφόρτωσης χειριστή Υλοποιείται μέσω παράκαμψης μεθόδου και εικονικών συναρτήσεων
Παράδειγμα, υπερφόρτωση μεθόδου. Πολλές μέθοδοι μπορεί να έχουν παρόμοια ονόματα αλλά διαφορετικό αριθμό ή τύπους ορισμάτων Παράδειγμα, παράκαμψη μεθόδου. Πολλές μέθοδοι μπορεί να έχουν παρόμοιο όνομα και ίδιο πρωτότυπο.
Ταχύτερη εκτέλεση, καθώς η ανακάλυψη της μεθόδου γίνεται κατά τη διάρκεια του χρόνου μεταγλώττισης Αργότερη εκτέλεση, καθώς η ανακάλυψη μεθόδου γίνεται κατά τον χρόνο εκτέλεσης.
Less παρέχεται ευελιξία για την επίλυση προβλημάτων αφού όλα είναι γνωστά κατά τη διάρκεια του χρόνου μεταγλώττισης. Παρέχεται μεγάλη ευελιξία για την επίλυση πολύπλοκων προβλημάτων αφού οι μέθοδοι ανακαλύπτονται κατά τη διάρκεια του χρόνου εκτέλεσης.

Συχνές Ερωτήσεις

Η υπερφόρτωση ορίζει αρκετές συναρτήσεις με το ίδιο όνομα αλλά διαφορετικές παραμέτρους, οι οποίες επιλύονται κατά τον χρόνο μεταγλώττισης χωρίς κληρονομικότητα. Η παράκαμψη επαναπροσδιορίζει μια κληρονομημένη συνάρτηση βασικής κλάσης με την ίδια υπογραφή σε μια παράγωγη κλάση, η οποία επιλύεται κατά τον χρόνο εκτέλεσης όταν η συνάρτηση δηλώνεται ως εικονική.

Μια καθαρή εικονική συνάρτηση δηλώνεται με = 0 και δεν έχει σώμα στην βασική κλάση. Οποιαδήποτε κλάση που περιέχει ένα γίνεται abs.tracκλάση t, η οποία δεν μπορεί να δημιουργηθεί άμεσα και αναγκάζει τις παράγωγες κλάσεις να παρέχουν τη δική τους υλοποίηση.

Όταν μια κλάση δηλώνει εικονικές συναρτήσεις, ο μεταγλωττιστής δημιουργεί έναν εικονικό πίνακα (vtable) δεικτών συναρτήσεων. Κάθε αντικείμενο αποθηκεύει έναν κρυφό δείκτη στην κλάση του vtable, επομένως ένας δείκτης βασικής κλάσης καλεί τη σωστή αντικατασταθείσα συνάρτηση κατά τον χρόνο εκτέλεσης μέσω καθυστερημένης σύνδεσης.

Ναι. Τα πρότυπα επιτρέπουν σε μια συνάρτηση ή κλάση να λειτουργεί σε πολλούς τύπους δεδομένων, με τον μεταγλωττιστή να δημιουργεί κώδικα συγκεκριμένου τύπου κατά τη μεταγλώττιση. Αυτός ο γενικός προγραμματισμός είναι μια μορφή στατικού πολυμορφισμού που συμπληρώνει την υπερφόρτωση συναρτήσεων και την υπερφόρτωση τελεστών.

Όταν διαγράφετε ένα παράγωγο αντικείμενο μέσω ενός δείκτη βασικής κλάσης, μόνο ένας εικονικός καταστροφέας εγγυάται ότι εκτελείται και ο παράγωγος καταστροφέας. Χωρίς αυτόν, ο καθαρισμός είναι ατελής και προκαλεί διαρροές μνήμης. Η δήλωση του βασικού καταστροφέα ως εικονικού κάνει την καταστροφή να συμπεριφέρεται πολυμορφικά.

Ο πολυμορφισμός επιτρέπει σε μία διεπαφή να χειρίζεται πολλούς τύπους αντικειμένων, μειώνοντας τον διπλότυπο κώδικα και απλοποιώντας τη συντήρηση. Υποστηρίζει ευέλικτα, επεκτάσιμα σχέδια όπου νέες παράγωγες κλάσεις συνδέονται χωρίς να αλλάζουν τον υπάρχοντα κώδικα και επιτρέπει ισχυρά μοτίβα που βασίζονται σε δείκτες και αναφορές βασικής κλάσης.

Ναι. Οι βοηθοί κωδικοποίησης τεχνητής νοημοσύνης μετατρέπουν ένα σύντομο σχόλιο σε υπερφορτωμένες συναρτήσεις, εικονικές βασικές κλάσεις και παράγωγες παρακάμψεις. Χειρίζονται γρήγορα επαναλαμβανόμενα στερεότυπα, αν και θα πρέπει να επαληθεύσετε τις εικονικές λέξεις-κλειδιά, τις υπογραφές συναρτήσεων και την ασφάλεια του καταστροφέα πριν από τη μεταγλώττιση του παραγόμενου κώδικα.

Ναί. GitHub Copilot Προτείνει δηλώσεις εικονικών συναρτήσεων, παρακάμψεις παράγωγων κλάσεων και υπερφορτώσεις τελεστών καθώς πληκτρολογείτε. Επιταχύνει την τυποποιημένη μορφή για ιεραρχίες κληρονομικότητας, αν και θα πρέπει να επιβεβαιώσετε την εικονική λέξη-κλειδί, τις αντίστοιχες υπογραφές και να διορθώσετε τη συμπεριφορά καθυστερημένης σύνδεσης πριν από τη δημιουργία.

Συνοψίστε αυτήν την ανάρτηση με: