Κληρονομικότητα

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή

Κληρονομικότητα σε κλάσεις

Ιδεατές συναρτήσεις

Παράδειγμα

Το παρακάτω παράδειγμα ορίζει τη βασική κλάση shape και τις υποκλάσεις της circle και rectangle. Η μέθοδος area ορίζεται ως virtual με αποτέλεσμα να μπορεί να οριστεί για τις υποκλάσεις και κατά την εκτέλεση του προγράμματος να εκτελεστεί η σωστή έκδοσή της. Η συνάρτηση printarea της shape εκμεταλλεύεται τη δυνατότητα αυτή και μπορεί να κληθεί (και να δουλέψει σωστά) με όρισμα οποιαδήποτε από τις υποκλάσεις της shape.
#include <iostream.h>

class shape {
private:
        double x, y;            // Position
public:
        void setposition(double x, double y);
        void printarea();
        virtual double area();
};

double
shape::area()
{
        return (0);
}

void
shape::printarea()
{
        cout << area() << "\n";
}


void shape::setposition(double x, double y)
{
        shape::x = x;
        shape::y = y;
}

class circle : public shape {
private:
        double radius;
public:
        void setradius(double r);
        virtual double area();
};

void
circle::setradius(double r)
{
        radius = r;
}

double
circle::area()
{
        return (3.1415927 * radius * radius);
}


class rectangle : public shape {
private:
        double height, width;
public:
        void setdimensions(double h, double w);
        virtual double area();
};

void
rectangle::setdimensions(double h, double w)
{
        height = h;
        width = w;
}

double
rectangle::area()
{
        return (height * width);
}

main()
{
        circle c;
        rectangle r;
        shape *sp;

        r.setposition(12);
        c.setposition(34);
        r.setdimensions(1010);
        c.setradius(1);
        c.printarea();
        r.printarea();
        sp = &r;
        cout << sp->area();
}

Αφηρημένες κλάσεις

Για παράδειγμα, ένας σχεδιασμός του πληροφοριακού συστήματος του Πανεπιστημίου μπορεί να ορίσει την αφηρημένη κλάση person ως βασική κλάση για τις υποκλάσεις student, employee και visitor. Αν και δε θα μπορεί να οριστεί μια μεταβλητή για την αφηρημένη κλάση person, αυτή μπορεί να περιέχει ορισμένα βασικά χαρακτηριστικά όπως birth_date και να επιβάλει την υλοποίηση συγκεκριμένων μεθόδων όπως home_page_URL() ορίζοντάς τις ως θεωρητικές.

Ασκήσεις

Άσκηση 4 (προαιρετική)

  1. Να υλοποιήσετε σε C++ τις κλάσεις icsd_student και math_student. Οι κλάσεις αυτές πρέπει να έχουν ως ιδιότητα τον αριθμό μαθημάτων που έχει περάσει ένας φοιτητής, αντίστοιχες μεθόδους πρόσβασης στην ιδιότητα αυτή και μια μέθοδο που να επιστρέφει αληθές αν ο φοιτητής μπορεί να πάρει πτυχίο (έχοντας περάσει 40 μαθήματα για την icsd_student και 38 για την math_student). Να χρησιμοποιήσετε κληρονομικότητα για να ελαχιστοπιήσετε τις μεθόδους των κλάσεων.
  2. Γράψτε ένα μικρό πρόγραμμα που να ελέγχει τη λειτουργία των κλάσεων αυτών.