cpp:multiple_inheritance
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
cpp:multiple_inheritance [2017/04/22 17:23] – gthanos | cpp:multiple_inheritance [2019/05/10 08:12] – gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Κληρονομικότητα πολλών γονικών κλάσεων ====== | ====== Κληρονομικότητα πολλών γονικών κλάσεων ====== | ||
- | Η C++ δίνει την δυνατότητα να έχετε περισσότερες από μία γονικές κλάσεις για μία κλάση απόγονο. Εκ πρώτης όψεως αυτό έρχεται σε αντίθεση με τη Java που επιτρέπει μόνο μία γονική κλάση κατά την διαδικασία της κληρονομικότητας. Γενικά η πολλαπλή κληρομικότητα θα πρέπει να χρησιμοποιείται με πολύ προσοχή και όπου είναι δυνατόν να αποφεύγεται. | + | Η C++ δίνει την δυνατότητα να έχετε περισσότερες από μία γονικές κλάσεις για μία κλάση απόγονο. Εκ πρώτης όψεως αυτό έρχεται σε αντίθεση με τη βασική αρχή στη Java που επιτρέπει μόνο μία γονική κλάση κατά την διαδικασία της κληρονομικότητας. Γενικά, η πολλαπλή κληρονομικότητα θα πρέπει να χρησιμοποιείται με πολύ προσοχή και όπου είναι δυνατόν να αποφεύγεται. |
- | Παρακάτω δίνεται ένα σχετικά απλό παράδειγμα πολλαπλής κληρονομικότητας. | + | Δεν πρέπει όμως να ξεχνάμε ότι τα // |
+ | <code cpp Stack.h> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | #ifndef __STACK_H__ | ||
+ | #define __STACK_H__ | ||
+ | class Stack { | ||
+ | public: | ||
+ | virtual int size()=0; | ||
+ | virtual void push(int o)=0; | ||
+ | virtual int pop()=0; | ||
+ | virtual int top()=0; | ||
+ | }; | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | <code cpp LinkedList.h> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | #ifndef __LINKEDLIST_H__ | ||
+ | #define __LINKEDLIST_H__ | ||
+ | |||
+ | class LinkedNode { | ||
+ | int element; | ||
+ | LinkedNode *next; | ||
+ | public: | ||
+ | LinkedNode(LinkedNode *nxt, int e); | ||
+ | LinkedNode(int e); | ||
+ | int getElement(); | ||
+ | LinkedNode* getNext(); | ||
+ | void setElement(int e); | ||
+ | void setNext(LinkedNode *nxt); | ||
+ | }; | ||
+ | |||
+ | class LinkedList { | ||
+ | LinkedNode *head; | ||
+ | int listSize; | ||
+ | public: | ||
+ | LinkedList(); | ||
+ | int size(); | ||
+ | void insertFirst(int o); | ||
+ | void insertAfter(LinkedNode *prev, int o); | ||
+ | int deleteFirst(); | ||
+ | int deleteAfter(LinkedNode *prev); | ||
+ | int valueAt(int pos); | ||
+ | }; | ||
+ | |||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | <code cpp LinkedList.cpp> | ||
+ | |||
+ | #include " | ||
+ | |||
+ | /* LinkedNode functions | ||
+ | * */ | ||
+ | |||
+ | LinkedNode:: | ||
+ | next = nxt; | ||
+ | element = e; | ||
+ | } | ||
+ | |||
+ | LinkedNode:: | ||
+ | int LinkedNode:: | ||
+ | LinkedNode* LinkedNode:: | ||
+ | void LinkedNode:: | ||
+ | void LinkedNode:: | ||
+ | |||
+ | /* LinkedList functions | ||
+ | * */ | ||
+ | |||
+ | LinkedList:: | ||
+ | listSize = 0; | ||
+ | head = NULL; | ||
+ | } | ||
+ | |||
+ | int LinkedList:: | ||
+ | |||
+ | void LinkedList:: | ||
+ | LinkedNode *node = new (nothrow) LinkedNode(head, | ||
+ | head = node; | ||
+ | listSize++; | ||
+ | } | ||
+ | |||
+ | void LinkedList:: | ||
+ | LinkedNode *node = new (nothrow) LinkedNode(prev-> | ||
+ | prev-> | ||
+ | listSize++; | ||
+ | } | ||
+ | |||
+ | int LinkedList:: | ||
+ | if(size()==0) | ||
+ | return -1; | ||
+ | LinkedNode *node = head; | ||
+ | head = head-> | ||
+ | int o = node-> | ||
+ | delete node; | ||
+ | listSize--; | ||
+ | return o; | ||
+ | } | ||
+ | |||
+ | int LinkedList:: | ||
+ | LinkedNode *node = prev-> | ||
+ | prev-> | ||
+ | int o = node-> | ||
+ | delete node; | ||
+ | listSize--; | ||
+ | return o; | ||
+ | } | ||
+ | |||
+ | int LinkedList:: | ||
+ | if(pos >= size() ) | ||
+ | return -1; | ||
+ | LinkedNode *curr = head; | ||
+ | for(int i=0; i<pos; i++, curr=curr-> | ||
+ | ; | ||
+ | return curr-> | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code cpp LinkedStack.h> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | #ifndef __LINKEDSTACK_H__ | ||
+ | #define __LINKEDSTACK_H__ | ||
+ | |||
+ | class LinkedStack : public Stack, private LinkedList { | ||
+ | public: | ||
+ | LinkedStack(); | ||
+ | int size(); | ||
+ | void push(int o); | ||
+ | int pop(); | ||
+ | int top(); | ||
+ | }; | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | <code cpp LinkedStack.cpp> | ||
+ | |||
+ | #include " | ||
+ | |||
+ | LinkedStack:: | ||
+ | int LinkedStack:: | ||
+ | |||
+ | void LinkedStack:: | ||
+ | insertFirst(o); | ||
+ | } | ||
+ | |||
+ | int LinkedStack:: | ||
+ | return deleteFirst(); | ||
+ | } | ||
+ | |||
+ | int LinkedStack:: | ||
+ | return valueAt(0); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code cpp StackUsage.cpp> | ||
+ | #include " | ||
+ | |||
+ | #define ARRAY_SIZE 10 | ||
+ | |||
+ | void invertArray(int array[], int arraySize, Stack &stack) { | ||
+ | for(int i=0; i< | ||
+ | stack.push(array[i]); | ||
+ | | ||
+ | for(int i=0; i< | ||
+ | array[i] = stack.pop(); | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | LinkedStack st; | ||
+ | int array[] = { 100, 99, 98, 97, 96, 95, 94, 93, 92, 91 }; | ||
+ | | ||
+ | for(int e:array) | ||
+ | cout << e << endl; | ||
+ | cout << endl; | ||
+ | | ||
+ | invertArray(array, | ||
+ | | ||
+ | for(int e:array) | ||
+ | cout << e << endl; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Ο κώδικας μεταγλωττίζεται ως εξής: | ||
+ | < | ||
+ | g++ -g -std=c++11 -o stack StackUsage.cpp ArrayStack.cpp LinkedList.cpp LinkedStack.cpp | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 80%> | ||
+ | Σε αυτό το σημείο θα πρέπει να σημειώσουμε ότι η επιλογή της κληρονομικότητας στη συγκεκριμένη περίπτωση **είναι λανθασμένη** και έγινε μόνο και μόνο για λόγους παρουσίασης της πολλαπλής κληρονομικότητας. | ||
+ | |||
+ | Όπως έχουμε | ||
+ | </ | ||
+ | |||
+ | <WRAP center round tip 80%> | ||
+ | **Προκειμένου να μην δημοσιοποιήσουμε την παραπάνω λάθος σχέση κληρονομικόητας**, | ||
+ | |||
+ | Εάν η σχέση κληρονομικότητας είχε οριστεί //public//, τότε οι μέθοδοι και οι κλάσεις που χρησιμοποιούν τη // | ||
+ | |||
+ | Εάν η σχέση κληρονομικότητας είχε οριστεί // | ||
+ | </ | ||
cpp/multiple_inheritance.txt · Last modified: 2021/05/07 08:44 (external edit)