Dinos_12345 Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 Καλησπέρα! Έχω μία άσκηση στη C++ Το Specification λέει, ότι έστω ότι έχω μία κλάση Insurance, μία AutoInsurance και μία LifeInsurnace. class Insurance{ public: int afm; int age; int max_amount; string name; string surname; Insurance(string,string,int,int,int); void display(); }; class CarInsurance:public Insurance{ public: int car_age; CarInsurance(string,string,int,int,int,int); int calc_cost(int); void display(); }; Την Life δεν την γράφω. Αν η Insurance έχει μέσα την display method, που τυπώνει τα δικά της attributes, να κάνω overload την display, για την Car και την Life ώστε να τυπώνει και το κόστος της κάθε μίας αντίστοιχα. Πως θα κάνω κάτι τέτοιο; Σκέφτηκα να ορίσω μία display σε κάθε κλάση, την οποία να την βάλω να τυπώνει το κόστος, και αφού θα έχει κληρονομηθεί η display την μαμάς κλάσης και στη life και στην car, τότε θα πάρει την θέση της η νέα. Αλλά δεν ξέρω αν είμαι σωστός. Ευχαριστώ.
groot Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 Καλείς την display της parent και συμπληρώνεις με ό,τι θες από την child.
Moderators Kercyn Δημοσ. 11 Απριλίου 2016 Moderators Δημοσ. 11 Απριλίου 2016 Τα πάντα public γιατί; Αυτό που θες είναι μια virtual (ή pure virtual αναλόγως του σχεδιασμού που θα κάνεις) function την οποία θα πρέπει να κάνουν override όλες οι derived κλάσεις (αν βάλεις virtual function σε κάποια κλάση βάλε και virtual destructor για να αποφύγεις τυχόν memory leaks - http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors). EDIT: Ή μπορείς να κάνεις αυτό που λέει ο groot, να έχεις δηλαδή μια display στη base class σου η οποία θα καλείται από την display της derived class, η οποία θα έχει και ό,τι έξτρα θέλεις.
Dinos_12345 Δημοσ. 11 Απριλίου 2016 Μέλος Δημοσ. 11 Απριλίου 2016 Τα πάντα public γιατί; Αυτό που θες είναι μια virtual (ή pure virtual αναλόγως του σχεδιασμού που θα κάνεις) function την οποία θα πρέπει να κάνουν override όλες οι derived κλάσεις (αν βάλεις virtual function σε κάποια κλάση βάλε και virtual destructor για να αποφύγεις τυχόν memory leaks - http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors). EDIT: Ή μπορείς να κάνεις αυτό που λέει ο groot, να έχεις δηλαδή μια display στη base class σου η οποία θα καλείται από την display της derived class, η οποία θα έχει και ό,τι έξτρα θέλεις. Όλα public επειδή, spec. Δεν θέλω virtual ακόμα, είναι στα προσεχώς. Μπορείς να μου κάνεις ένα παράδειγμα από αυτό που είπε ο groot; Αν κάνω void display(); μου χτυπάει 2 σελίδες σφάλμα.
the other one Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 Φαντάζομαι εννοείς override όχι overload. Γενικά έτσι είναι ναι απλά αν τα attributes είναι δηλωμένα private ( που καλό είναι να ναι έτσι ) δε θα μπορεί να τα δει η subclass θα καλέσεις τη display της Insurance μέσα από την overriden υλοποίηση που θα φτιάξεις και έπειτα προσθέτεις και τα εκάστοτε attributes της subclass ( υποθέτω αυτό είπε κι ο groot ). Επίσης αν θες να χεις και πολυμορφισμό καλή ίδέα είναι της Insurance να τη δηλώσεις virtual.
Dinos_12345 Δημοσ. 11 Απριλίου 2016 Μέλος Δημοσ. 11 Απριλίου 2016 Φαντάζομαι εννοείς override όχι overload. Γενικά έτσι είναι ναι απλά αν τα attributes είναι δηλωμένα private ( που καλό είναι να ναι έτσι ) δε θα μπορεί να τα δει η subclass θα καλέσεις τη display της Insurance μέσα από την overriden υλοποίηση που θα φτιάξεις και έπειτα προσθέτεις και τα εκάστοτε attributes της subclass ( υποθέτω αυτό είπε κι ο groot ). Επίσης αν θες να χεις και πολυμορφισμό καλή ίδέα είναι της Insurance να τη δηλώσεις virtual. Υπερφόρτωση λέει. Προς το παρόν τα θέλει όλα public. Virtual methods έχει στην επόμενη άσκηση.
Moderators Kercyn Δημοσ. 11 Απριλίου 2016 Moderators Δημοσ. 11 Απριλίου 2016 Χωρίς virtual και να έχεις το ίδιο όνομα σε base και derived δε νομίζω να γίνεται (θα έλεγα σίγουρα δε γίνεται αλλά δεν το ρισκάρω ) http://ideone.com/up7WEc EDIT: Για βάλε λίγο την εκφώνηση γιατί δεν πολυβγάζω νόημα. Overloaded γιατί; Τι διαφορετικό θέλει;
defacer Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 Υπερφόρτωση λέει. Προς το παρόν τα θέλει όλα public. Virtual methods έχει στην επόμενη άσκηση. Παίρνω σα δεδομένο πως όντως λέει και εννοεί overload και δεν έχει να κάνει καθόλου με virtual methods η άσκηση. Μ' αυτές τις υποθέσεις, η εκφώνηση είναι τελείως ηλίθια και από τα πλέον άσχημα παραδείγματα που θα μπορούσα να σκεφτώ. Αυτός που την έκανε δεν έχει ιδέα από C++ παρά μόνο σε τελείως ρηχό επίπεδο. Αυτό τον καθιστά επικίνδυνο. Θα υπογραμμίσω αυτό που ανέφερε ο Kercyn παραπάνω: οποιαδήποτε class δεν είναι final πρέπει όπως και δήποτε να έχει virtual destructor, ασχέτως αν έχει καμία άλλη virtual method. Αυτό σαν rule of thumb. Υπάρχουν εξαιρέσεις, αλλά μέχρι να μπορεί κανείς να καταλαβαίνει μόνος του ποιές είναι αυτές πάντα με τον κανόνα.
Dinos_12345 Δημοσ. 11 Απριλίου 2016 Μέλος Δημοσ. 11 Απριλίου 2016 Παίρνω σα δεδομένο πως όντως λέει και εννοεί overload και δεν έχει να κάνει καθόλου με virtual methods η άσκηση. Μ' αυτές τις υποθέσεις, η εκφώνηση είναι τελείως ηλίθια και από τα πλέον άσχημα παραδείγματα που θα μπορούσα να σκεφτώ. Αυτός που την έκανε δεν έχει ιδέα από C++ παρά μόνο σε τελείως ρηχό επίπεδο. Αυτό τον καθιστά επικίνδυνο. Θα υπογραμμίσω αυτό που ανέφερε ο Kercyn παραπάνω: οποιαδήποτε class δεν είναι final πρέπει όπως και δήποτε να έχει virtual destructor, ασχέτως αν έχει καμία άλλη virtual method. Αυτό σαν rule of thumb. Υπάρχουν εξαιρέσεις, αλλά μέχρι να μπορεί κανείς να καταλαβαίνει μόνος του ποιές είναι αυτές πάντα με τον κανόνα. Η Άσκηση 2. Πρέπει να βάλω destructor, indeed.
Moderators Kercyn Δημοσ. 11 Απριλίου 2016 Moderators Δημοσ. 11 Απριλίου 2016 Αγγούρια, override εννοεί. Άμα ήθελε overload θα έλεγε θέλω στα overloaded display να δίνονται αυτές και αυτές οι παράμετροι. Το ότι σε μια κλάση βάζετε 10 διαφορετικά πράγματα δεν το σχολιάζω καν, "είναι άσκηση" και πάει στο διάλο...
defacer Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 Νομίζω απλά λέει υπερφόρτωση και εννοεί override. Τρεχαγύρευε.
the other one Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 δε χρειάζεσαι virtual πάντως αν δε τα καλείς μέσω pointer. δηλαδή αν πεις: Derived d; d.Display(); ..και έχεις κάνει override κανονικά θα καλέσει της Derived. Εκεί που θες virtual είναι αν θες να κάνεις αυτό: Derived d; Base *pb = &d; pb->Display(); σε αυτη τη περίπτωση αν δεν έχεις δηλώσει τη Display της base virtual θα καλέσει αυτηνής όχι την overriden. όχι όταν προσωπικά αν υλοποιήσω inheritance δε θα τα κάνω ολα virtual just saying.
Dinos_12345 Δημοσ. 11 Απριλίου 2016 Μέλος Δημοσ. 11 Απριλίου 2016 δε χρειάζεσαι virtual πάντως αν δε τα καλείς μέσω pointer. δηλαδή αν πεις: Derived d; d.Display(); ..και έχεις κάνει override κανονικά θα καλέσει της Derived. Εκεί που θες virtual είναι αν θες να κάνεις αυτό: Derived d; Base *pb = &d; pb->Display; σε αυτη τη περίπτωση αν δεν έχεις δηλώσει τη Display της base virtual θα καλέσει αυτηνής όχι την overriden. όχι όταν προσωπικά αν υλοποιήσω inheritance δε θα τα κάνω ολα virtual just saying. Καταλαβαίνω πως λειτουργεί το virtual και base virtual. Απλά στην προκειμένη έχω φάει σκάλωμα με το τι θέλει. Προφανώς δεν ήξερε η καθηγήτρια(ή όποιος έγραψε το spec που πιθανόν έχει αντιγράψει) την αντίστοιχη ελληνική λέξη για το overwrite. ΓΡΑΦΤΟ ΣΤΑ ΑΓΓΛΙΚΑ B**CH
Moderators Kercyn Δημοσ. 11 Απριλίου 2016 Moderators Δημοσ. 11 Απριλίου 2016 Πωωω, ΤΕΙ Αθήνας δεν είσαι; Άντε και σε λίγους μήνες μαζί με άλλους 600 να δώσετε το μάθημα.
παπι Δημοσ. 11 Απριλίου 2016 Δημοσ. 11 Απριλίου 2016 Καμία τέτοια πίπα θα θέλει. http://ideone.com/KNgNWG
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα