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

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

Δημοσ.

Καλησπέρα!

Έχω μία άσκηση στη 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, τότε θα πάρει την θέση της η νέα. Αλλά δεν ξέρω αν είμαι σωστός.

Ευχαριστώ.

  • Moderators
Δημοσ.

 

Τα πάντα 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 γιατί;

 

 

Αυτό που θες είναι μια 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 σελίδες σφάλμα.

Δημοσ.

Φαντάζομαι εννοείς override όχι overload. Γενικά έτσι είναι ναι απλά αν τα attributes είναι δηλωμένα private ( που καλό είναι να ναι έτσι ) δε θα μπορεί να τα δει η subclass θα καλέσεις τη display της Insurance μέσα από την overriden υλοποίηση που θα φτιάξεις και έπειτα προσθέτεις και τα εκάστοτε attributes της subclass ( υποθέτω αυτό είπε κι ο groot ).

 

Επίσης αν θες να χεις και πολυμορφισμό καλή ίδέα είναι της Insurance να τη δηλώσεις virtual.

Δημοσ.

Φαντάζομαι εννοείς override όχι overload. Γενικά έτσι είναι ναι απλά αν τα attributes είναι δηλωμένα private ( που καλό είναι να ναι έτσι ) δε θα μπορεί να τα δει η subclass θα καλέσεις τη display της Insurance μέσα από την overriden υλοποίηση που θα φτιάξεις και έπειτα προσθέτεις και τα εκάστοτε attributes της subclass ( υποθέτω αυτό είπε κι ο groot ).

 

Επίσης αν θες να χεις και πολυμορφισμό καλή ίδέα είναι της Insurance να τη δηλώσεις virtual.

Υπερφόρτωση λέει. Προς το παρόν τα θέλει όλα public. Virtual methods έχει στην επόμενη άσκηση.

  • Moderators
Δημοσ.

Χωρίς virtual και να έχεις το ίδιο όνομα σε base και derived δε νομίζω να γίνεται (θα έλεγα σίγουρα δε γίνεται αλλά δεν το ρισκάρω :P )

http://ideone.com/up7WEc

 

EDIT:

Για βάλε λίγο την εκφώνηση γιατί δεν πολυβγάζω νόημα. Overloaded γιατί; Τι διαφορετικό θέλει;

Δημοσ.

Υπερφόρτωση λέει. Προς το παρόν τα θέλει όλα public. Virtual methods έχει στην επόμενη άσκηση.

 

Παίρνω σα δεδομένο πως όντως λέει και εννοεί overload και δεν έχει να κάνει καθόλου με virtual methods η άσκηση.

 

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

 

Θα υπογραμμίσω αυτό που ανέφερε ο Kercyn παραπάνω: οποιαδήποτε class δεν είναι final πρέπει όπως και δήποτε να έχει virtual destructor, ασχέτως αν έχει καμία άλλη virtual method. Αυτό σαν rule of thumb. Υπάρχουν εξαιρέσεις, αλλά μέχρι να μπορεί κανείς να καταλαβαίνει μόνος του ποιές είναι αυτές πάντα με τον κανόνα.

Δημοσ.

Παίρνω σα δεδομένο πως όντως λέει και εννοεί overload και δεν έχει να κάνει καθόλου με virtual methods η άσκηση.

 

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

 

Θα υπογραμμίσω αυτό που ανέφερε ο Kercyn παραπάνω: οποιαδήποτε class δεν είναι final πρέπει όπως και δήποτε να έχει virtual destructor, ασχέτως αν έχει καμία άλλη virtual method. Αυτό σαν rule of thumb. Υπάρχουν εξαιρέσεις, αλλά μέχρι να μπορεί κανείς να καταλαβαίνει μόνος του ποιές είναι αυτές πάντα με τον κανόνα.

Η Άσκηση 2. Πρέπει να βάλω destructor, indeed.

post-335185-0-41808500-1460397747_thumb.png

  • Moderators
Δημοσ.

Αγγούρια, override εννοεί. Άμα ήθελε overload θα έλεγε θέλω στα overloaded display να δίνονται αυτές και αυτές οι παράμετροι. Το ότι σε μια κλάση βάζετε 10 διαφορετικά πράγματα δεν το σχολιάζω καν, "είναι άσκηση" και πάει στο διάλο...

Δημοσ.

δε χρειάζεσαι 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 πάντως αν δε τα καλείς μέσω 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 :lol:

  • Moderators
Δημοσ.

 

Πωωω, ΤΕΙ Αθήνας δεν είσαι; Άντε και σε λίγους μήνες μαζί με άλλους 600 να δώσετε το μάθημα.

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...