You are on page 1of 22

eClass C Plus Plus

Εισαγωγή

Πρόγραμμα ασκήσεων βάση θεωρίας από Γιώργο Αραζούζο

ΕΒΔ.Κ ΗΜ/ΝΙΑ ΔΙΔΑΣΚΟΜΕΝΗ ΥΛΗ ΠΑΡΑΤΗΡΗΣΕΙΣ


ΑΤ.

Εισαγωγή

Συναρτήσεις

Αντικειμενοστραφής Προγραμματισμός

Συναρτήσεις 2

Εισαγωγή Δεδομένων σε κλάση
η
6
Κλάσεις
η
7
Αντικειμενοστραφής Ανάλυση & Σχεδίαση
η
8
Είσοδος/Εξοδος στην C++

Είσοδος/Εξοδος Συναρτήσεις στην C++
10η
Εντολές Ελέγχου (While,for...)
11η Συναρτήσεις & Κλάσεις
12η
Pointers

13η
Αναφορές(References)

14η Inheritance

15η Polymorphism

1 Εισαγωγή
Ασκήσεις πάνω σε δομικά στοιχεία της γλώσσας

Τελεστές ++ και –
/*
Εκφώνηση: Να γραφεί πηγαίος κώδικας, ο

1
οποίος να δέχεται από το πληκτρολόγιο δύο
ακέραιους αριθμούς x και y. Στη συνέχεια να
εμφανίζει τον αριθμό x και τους δύο επόμενους x +
1, x + 2 σε μια γραμμή και τους αριθμούς y, y + 5 ,
y + 10 , στην επόμενη γραμμή. Ο πηγαίος κώδικας
να περιέχει εντολές με τον τελεστή αύξησης και
σύνθετες εντολές καταχώρησης.
*/
#include <iostream>
using namespace std;

int main()
{
int x,y;

cout << "Pliktrologise 2 akeraious arithmous\n";


cin >> x >> y;
cout << "O arithmos x kai oi 2 epomenoi toy einai"<<endl;
cout<<"x= "<< x;
++x;
cout<<", x+1= "<< x;
++x;
cout<<", x+2= "<<x<<endl;

int a,b;
a = y;
y += 5;
b = y;
y += 5;
cout << "Oi arithmoi y, y+5, y+10 einai \n" << a <<","<< b <<","<< y;

return 0;
}

2 Συναρτήσεις
/*
Υπολογισμός αριθμητικής παράστασης με χρήση συναρτήσεων pow(), sqrt()
*/
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
double x, y, z;

cout <<"Enter two numbers x and y"<<endl;


cin >> x >> y;
z = pow(x, sqrt(y));

2
cout << "The value of x to the "<<endl;
cout << "power of square root of y is"<<endl;
cout << z<<endl;
return 0;
}

Τριγωνομετρία και συναρτήσεις

/*
Υπολογισμός εμβαδού κύκλου και όγκου με χρήση καθολικής μεταβλητής, ΠΙ, 2
συναρτήσεων.
*/
#include <iostream>
#include <cmath>
using namespace std;
const double PI = 3.14159; //Καθολική μεταβλητή
// Dilosi synartiseon
double area (double radius);
double volume (double radius);

int main()
{
double radius, area_of_cycle, volume_of_sphere;
//Εισαγωγή ακτίνας
cout << "Enter the radius\n"<<endl;
cin >> radius;

//Κλήση συναρτήσεων
area_of_cycle = area(radius);
volume_of_sphere = volume(radius);

//Έξοδος αποτελεσμάτων
cout<<"Area of cycle = "<< area_of_cycle << " square centimetres"<<endl;
cout<<"Volume of sphere = "<<volume_of_sphere << "cubic centimetres"<<endl;

return 0;
}

//definitions of functions
double area (double radius)
{
return (PI * pow(radius, 2) );
}

double volume (double radius)


{
return ( ( 4.0 / 3.0) * PI * pow(radius, 3) );
}

3
3 Αντικειμενοστραφής Προγραμματισμός
Κλάσεις
/*
Χρήση του this
*/
#include <iostream>
using namespace std;

class Test
{
public:
Test(int a);
void print();
private:
int x;
};
/*Ορισμός μεθόδου Test με βάση την κλάση Test*/
Test::Test(int a)
{
x = a;
}

/*Ορισμός μεθόδου print με βάση την κλάση Test*/


void Test::print()
{
cout << "cx = " << x<< "\n this->x = " << this->x << "\n(*this).x = " << (*this).x <<
endl;
}

int main()
{
Test testObject(12); //Ορισμός αντικειμένου με πέρασμα τιμής
testObject.print();
return 0;
}

4 Συναρτήσεις 2
Παράμετροι με πέρασμα τιμής

#include <iostream>
using namespace std;
float average(int x1, int x2);

4
int main()
{
int a=6,b=10;
cout<<average(a,b);
}

float average(int x1, int x2)


{
x1 = (x1 + x2)/2;
return x1;
}

Παράμετροι με πέρασμα αναφοράς


/*
Οι τιμές αναφέρονται στις θέσεις μνήμης των παραμέτρων.
Χρήση: type& variable_name π.χ. double% wage.
Ανάμειξη κλήσεων: double compute(int& x).
Κλήση όπως οι συναρτήσεις: compute(3, 3.14).
*/
#include <iostream>
using namespace std;
void swap(int &, int &);

int main()
{
int a=5, b=7;

cout << "Before swap\n" << "a = " << a << " b = " << b << '\n';
swap(a, b);
cout << "After swap\n" << "a = " << a << " b = " << b << '\n';

return 0;
}
/* Παρατηρήστε πως γίνεται η αλλαγή τιμών μεταξύ των μεταβλητών ώστε να μην
χαθούν οι τιμές*/
void swap(int &x, int &y)
{
int temp = x;

x = y;
y = temp;
}

Υπερφόρτωση overload
/*
Υπολογισμός μέσης τιμής βάση παραμέτρου b. Χρήση 2 συναρτήσεων με το ίδιο όνομα.
*/

5
#include <iostream>
#include <cmath>
using namespace std;
//Overloaded functions
double ave (double n1, double n2);
double ave (double n1, double n2, double n3);

int main()
{
bool b;
double x;

cout<<"Enter the numbers b and x\n";


cin>> b >> x;
if (b==0)
cout<<"The average of x and x square is " << ave( x, pow(x,2))<<endl;
else
cout<<"The average of x, x square and x cube is " << ave(x,
pow(x,2),pow(x,3))<<endl;
return 0;
}

//Functions
double ave (double n1, double n2)
{
return ((n1+n2)/2.0);
}

double ave (double n1, double n2, double n3)


{
return ((n1+n2+n3)/3.0);
}

5 Εισαγωγή Δεδομένων σε κλάση


Παράδειγμα ιδιοτήτων
/*
Ορισμός κλάσης με ιδιότητες.
*/
#include <iostream>
using namespace std;
class animal {
public: //Ιδιότητες public για πρόσβαση αυτών μέσα στην main.
int weight;
int feet;
};

6
int main()
{
animal dog1, dog2, chicken, cat1;

dog1.weight = 15;
dog2.weight = 37;
chicken.weight = 3;

dog1.feet = 4;
dog2.feet = 4;
chicken.feet = 2;

cout << "The weight of dog1 is " << dog1.weight << "\n";
cout << "The weight of dog2 is " << dog2.weight << "\n";
cout << "The weight of chicken is " << chicken.weight << "\n";

return 0;
}

Ιδιότητες και μέθοδοι κλάσεων


/*
Ορισμός κλάσης με ιδιότητες & μεθόδους.
*/
#include <iostream>
using namespace std;
class Date {
public:
Date(int, int, int);
void set(int, int, int);
void print();
private:
int year;
int month;
int day;
};

int main()
{
//Declare today to be object of class Date
Date today(1,9,2016);
cout << "This program was written on ";
today.print();
cout << "This program was modified on ";
today.set(5,10,2016);
today.print();

return 0;

7
}

//Methods declaration
Date::Date(int d, int m, int y)
{
// Date constructor function definition
if(d>0 && d<31)
day = d;
if(m>0 && m<13)
month = m;
if(y>0)
year =y;
}

void Date::set(int d, int m, int y)


{
// Date member function definitions
if(d>0 && d<31)
day = d;
if(m>0 && m<13)
month = m;
if(y>0)
year =y;
}

void Date::print()
{
cout << day << "-" << month << "-" << year << endl;
}

Παράδειγμα αποθήκης ανταλλακτικών


/*
Δομή για αποθήκη ανταλλακτικών για διάφορες συσκευές.
*/
#include <iostream>
using namespace std;

class part //καθοριςμόσ ενόσ αντικειμϋνου


{
private:
int modelnumber; //κωδικόσ αριθμόσ τησ ςυςκευόσ
int partnumber; //κωδικόσ αριθμόσ ανταλλακτικού ςυςκευόσ
float cost;//κόςτοσ ανταλλακτικού
public:
void setpart(int mn, int pn, float c) //οριςμόσ τιμών δεδομϋνων
{
modelnumber=mn;
partnumber=pn;

8
cost=c;
}
void showpart() //εμφϊνιςη δεδομϋνων
{
cout<< "\n Montelo " << modelnumber;
cout<< ", antallaktiko " << partnumber;
cout<< " , kostos " << cost << " euro";
}
};

int main()
{
part part1; //Ορισμός αντικειμένων
part1.setpart (6244, 373, 217.55); //Κλήση συνάρτησης-μέλους
part1.showpart ();
return 0;
}

6 Κλάσεις
/*
Ορισμός κλάσης.
*/
#include <iostream>
using namespace std;

class Point
{
public:
Point(); //constructor
void setPoint(int a,int b); //καθορισμός συντεταγμένων
void printPoint(); //εκτύπωση συντεταγμένων
private:
int x;
int y;
};

Point::Point() //ο constructor του σημείου αρχικοποιεί


{ //τα μέλη δεδομένων με την τιμή 0
x=0;
y=0;
}

void Point::setPoint(int a, int b)


{
x=a;
y=b;
}

9
void Point::printPoint()
{
cout<<x<<" "<<y<<"\n";
}

int main()
{
Point p;
p.setPoint(5,10);
p.printPoint();
return 0;
}

7 Αντικειμενοστραφής Ανάλυση & Σχεδίαση


Ποιες από τις παρακάτω δύο δηλώσεις κλάσεων, είναι σωστή σύμφωνα με τις αρχές του
αντικειμενοστραφούς σχεδιασμού:

1.

class Mailbox {
private:
void add(Message);
Message g _ ();
et_current();
void delete_current();
public:
//…. properties
};

2.

class Mailbox {
private:
//…. properties
public:
void add(Message);
Message g _ ();
et_current();
void delete_current();
};

8 Είσοδος/Εξοδος στην C++


/*
Υπολογισμός εμβαδού κύκλου

10
*/
#include <iostream>
using namespace std;

int main()
{
float aktina,emvadon;

cout<<"Doste thn Aktina tou Kyklou";


cin>>aktina;
emvadon=3.14*aktina*aktina;
cout<<"To emvadon einai :"<<emvadon;

if (emvadon ==0)
cout<<"Den yparxei tetoio emvadon \n";
else
cout<<"Apodekth timh gia emvadon \n";
}

9 Είσοδος/Εξοδος Συναρτήσεις στην C++


/*
Υπολογισμός συνολικής τιμής προϊόντος με χρήση συνάρτησης.
*/
#include <iostream>
using namespace std;

double total_cost(int number_par, double price_par);


//Computes the total cost, including 5% sales tax,
//on number_par items at a cost of price_par each.

int main()
{
double price, bill;
int number;

cout << "Enter the number of items purchased: ";


cin >> number;
cout << "Enter the price per item $";
cin >> price;

bill = total_cost(number, price);


cout << number << " items at "<< "$" << price << " each.\n"
<< "Final bill, including tax, is $" << bill << endl;

return 0;
}

11
double total_cost(int number_par, double price_par)
{
const double TAX_RATE = 0.05; //5% sales tax
double subtotal;
subtotal = price_par * number_par;
return (subtotal + subtotal*TAX_RATE);
}

10 Εντολές Ελέγχου (While,for...)


Δομή while
/*Εκφώνηση: Να γραφεί πρόγραμμα στη C++ το οποίο να δέχεται
έναν ακέραιο θετικό αριθμό από το πληκτρολόγιο και
μετά να γράφει σε μια γραμμή τη λέξη Hello τόσες
φορές όσες είναι ο αριθμός. Η εισαγωγή και εξαγωγή
να επενδυθούν με κατάλληλα μηνύματα.
*/
#include <iostream>

using namespace std;

int main()
{
int number;
cout << "Poses fores theleis na sou po Hello? ";
cin >> number;

while (number>0)
{
cout << "Hello ";
number = number - 1; // ή number --;
}
cout << endl;

//return 0;
}

Δομή do while
/*
Εκφώνηση: Να αναπτυχθεί πρόγραμμα, το οποίο να τυπώνει στην
οθόνη την έκφραση Hello. Κατόπιν ο χρήστης μετά
από κατάλληλο μήνυμα να εισάγει y ή Y, αν θέλει να
ξανατυπωθεί σε νέα γραμμή πάλι η ίδια φράση. Αν
πληκτρολογηθεί οτιδήποτε άλλο, το πρόγραμμα να
τελειώνει αφού πρώτα τυπώσει στην οθόνη τη λέξη

12
Good-Bye
*/
#include <iostream>

using namespace std;

int main()
{
char ans;

do{
cout << "Hello\n";
cout << "Do you want another greeting?\n" << "Press y for yes, n for
no,\n" << "and then press return: ";
cin >> ans;
} while (ans == 'y' || ans == 'Y');

cout << "Good-Bye\n";

return 0;
}

Δομή while – εύρεση μεγίστου


/*
Παράδειγμα: Εύρεση μεγίστου.
Στη διαδικασία εύρεσης του μεγίστου ο αλγόριθμος αρχίζει θεωρώντας ως
μέγιστο (MAX) μια πολύ μικρή τιμή, η οποία στη συνέχεια θα αντικατασταθεί
οπωσδήποτε. Εάν λοιπόν οι αριθμοί είναι θετικοί ως αρχική τιμή στον ΜΑΧ βάζουμε το 0.
Εάν είναι ακέραιοι βάζουμε τον μικρότερο ακέραιο αριθμό που μπορεί να
αναπαρασταθεί στον υπολογιστή δηλαδή το -32768.
*/
#include <iostream>
using namespace std;

int main()
{
int a, max, i, N;
cout << "How many numbers will you insert?";
cin >> N;

max = -32768;
i=1;
while ( i <= N )
{
cout << "Write the number " << i << ": ";
cin>>a; //Διάβασε αριθμό
if ( a > max ) max = a; //Καταχώρησε τον αριθμό εάν > max
i++; //Αύξηση μετρητή
}
cout << "The max = " << max;

13
}

Δομή for
/*
Εκφώνηση: Να γραφεί πρόγραμμα το οποίο να δέχεται έναν ακέραιο θετικό αριθμό,
ας πούμε κ, από το πληκτρολόγιο. Στη συνέχεια να υπολογίζει το άθροισμα 1 + 2 +
+ κ και να το εμφανίζει στην οθόνη μετά από κατάλληλο μήνυμα.
*/
#include <iostream>

using namespace std;

int main()
{
int k, sum = 0;
cout << "Enter a positive number:\n";
cin >> k;

for (int n = 1; n <= k; n++)//Variable n is a local


sum = sum + n; //Variable of the body of the for loop!
cout << "The sum of the numbers 1 to " << k << " is " << sum << endl;

return 0;
}

Δομή if
/*
Εκφώνηση: Να γραφεί πρόγραμμα για τον υπολογισμό του φόρου
εισοδήματος. Το πρόγραμμα να δέχεται τα έσοδα από το
πληκτρολόγιο μετά από κατάλληλο μήνυμα και να εμφανίζει στην
οθόνη το φόρο με κατάλληλο μήνυμα. Ο φόρος υπολογίζεται ως
εξής: Για το εισόδημα που είναι μικρότερο ή ίσο των 10.000 Euro
δεν πληρώνεται φόρος. Για το εισόδημα μεγαλύτερο των 10.000
Euro και μικρότερο ή ίσο των 20.000 Euro ο φόρος είναι 5% και
για το ποσό που είναι μεγαλύτερο των 20.000 Euro ο φόρος είναι
10%.

*/
#include <iostream>

using namespace std;

int main()
{
int esoda;
double foros;

14
cout << "Pliktrologise ta esoda : ";
cin >> esoda;

//Εάν μετά την if έχουμε 1 εντολή, τότε δεν χρειάζονται οι αγκύλες.


if (esoda <= 10000)
foros = 0;
else if ( (esoda > 10000) && (esoda <= 20000) )
foros = 0.05 * (esoda - 10000);
else
foros = 500.0 + 0.1 * (esoda - 20000);
/*if (esoda <= 10000)
foros = 0;
else if ( (esoda > 10000) && (esoda <= 20000) )
foros = 0.05 * (esoda – 10000);
else
foros = 500.0 + 0.1 * (esoda – 20000);*/

cout << "O foros einai " << foros << " Euro";
return 0;
}

Δομή switch
/*
Να γραφεί πρόγραμμα στη C++,
το οποίο να δέχεται από το πληκτρολόγιο τη
βαθμολογία A, B, C, D, E ενός φοιτητή και μετά να
του απαντάει (στην οθόνη) με τα παρακάτω
μηνύματα: Αν ο βαθμός είναι A, B, C, να γράφεται
αντίστοιχα η λέξη arista, poli kala και kala. Αν ο
βαθμός είναι D ή E να γράφεται η λέξη aporriptesai.
Σε κάθε άλλη περίπτωση να τυπώνεται το μήνυμα
Autos den einai vathmos mathimatos.
*/
#include <iostream>

using namespace std;

int main()
{
char grade;
cout << "Dose to bathmo toy mathimatos kai patise to Enter:";
cin >> grade;

switch (grade)
{
case 'A':
case 'a':
cout << "arista\n";
break;

15
case 'B':
cout << "poli kala\n";
break;
case 'C':
cout << "kala\n";
break;
case 'D':
cout << "aporriptesai\n";
break;
case 'E':
cout << "aporriptesai\n";
break;
default:
cout <<"Aytos den einai vathmos mathimatos.\n";
}
return 0;
}

/*
Μια επιχείρηση, που πουλάει ένα εμπόρευμα
σε χονδρική ή λιανική τιμή, θέλει να αναπτύξει ένα πρόγραμμα
για τη χρέωση των πελατών της. Όταν η πώληση είναι χονδρική
ο πελάτης δεν πληρώνει ΦΠΑ, ενώ όταν είναι λιανική πληρώνει
5% ΦΠΑ. Ο λογιστής της επιχείρησης θα πληκτρολογεί W ή w,
αν πρόκειται για χονδρική και R ή r, αν πρόκειται για λιανική
πώληση. Θα πληκτρολογεί επίσης τα τεμάχια που αγοράζει ο
πελάτης καθώς και την τιμή του τεμαχίου. Η χρέωση θα
εμφανίζεται στην οθόνη. Να γραφεί το πρόγραμμα έτσι ώστε οι
εισαγωγές δεδομένων από το πληκτρολόγιο και οι εμφανίσεις
αριθμών στην οθόνη να επενδύονται με κατάλληλα μηνύματα.
Να εμφανίζεται και κατάλληλο μήνυμα στην περίπτωση που ο
λογιστής δεν πληκτρολογήσει W, w, R ή r.

Λύση. Στη μεταβλητή total θα γραφεί η τελική χρέωση. Στην περίπτωση της χονδρικής
πώλησης
είναι:
total = number * price
ενώ στην περίπτωση της λιανικής:
subtotal = number * price
total = subtotal + 0.05 * subtotal.
. Όπου number είναι ο πλήθος των τεμαχίων που αγοράστηκαν.
. Η μεταβλητή total μπορεί να είναι κοινή σε δύο μπλοκ
*/
#include <iostream>
using namespace std;
const double TAX_RATE = 0.05; //5% sales tax.

int main()
{

16
char sale_type;
int number;
double price, total;

cout << "Enter price $";


cin >> price;
cout << "Enter number purchased: ";
cin >> number;

cout << "Type W if this is a wholesale purchase.\n"


<< "Type R if this is a retail purchase.\n"
<< "Then press Return.\n";
cin >> sale_type;

if ((sale_type == 'W') || (sale_type == 'w'))


{
total = price * number;
}
else if ((sale_type == 'R') || (sale_type == 'r'))
{
double subtotal;
subtotal = price * number;
total = subtotal + subtotal * TAX_RATE;
}
else
{
cout << "Error in input.\n";
}

//Set the format of values


cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);

cout << number << " items at $" << price << endl;
cout << "Total Bill = $" << total;

if ((sale_type == 'R') || (sale_type == 'r'))


cout << " including sales tax.\n";

return 0;
}

11 Συναρτήσεις & Κλάσεις


Μελετήστε την παρακάτω άσκηση

#include <iostream>

17
using namespace std;
typedef unsigned short int USHORT;
enum BOOL { FALSE, TRUE};

class Rectangle
{
public:
Rectangle(USHORT width, USHORT height);
~Rectangle(){}
void DrawShape(USHORT aWidth, USHORT aHeight, BOOL UseCurrentVals
= FALSE) const;
private:
USHORT itsWidth;
USHORT itsHeight;
};

Rectangle::Rectangle(USHORT width, USHORT height): itsWidth(width), itsHeight(height)


{}

void Rectangle::DrawShape(USHORT width, USHORT height, BOOL UseCurrentValue )


const {
int printWidth ;
int printHeight;

if (UseCurrentValue == TRUE) {
printWidth = itsWidth;
printHeight = itsHeight; }
else {
printWidth = width;
printHeight = height;
}
for (int i = 0; i<printHeight; i++) {
for (int j = 0; j< printWidth; j++) {
cout << "*";
}
cout << "\n";
}
}

int main() {
Rectangle theRect( 30, 5);
cout << "DrawShape(0,0,TRUE)...\n";
theRect.DrawShape(0,0,TRUE);
cout <<"DrawShape(40,2)...\n";
theRect.DrawShape(40,2);
return 0;
}

18
12 Pointers
Δείκτες και strings
#include <iostream>

using namespace std;

int main()
{
char color[ ] = "green";
const char *carPtr = "green";

cout << "Print the 1st character of the constant string using pointer: " << *carPtr
<< endl;
cout << "Print the 2nd character of the constant string using pointer: " <<
*(carPtr+1);
cout << "\nPrint whole string: " << carPtr;

return 0;
}

Δείκτες και πίνακες


#include <iostream>

using namespace std;

int main()
{
int a[] = {10, 20, 30}, i, offset;
int *aPtr = a;

cout<<"Array a printed with:\n" <<"Array subscript notation\n";

for(i=0; i<3; i++)


cout<<"a[" << i << "] = "<< a[i] << '\n';

cout<<"\nOffset notation\n";
for(offset=0; offset<3; offset++)
cout<<"*(a + "<< offset << ") = " << *(a+offset) << '\n';

cout<<"\nPointer subscript notation\n";


for(i=0; i<3; i++)
cout<<"aPtr[" << i << "] =" << aPtr[i] << '\n';

cout<<"\nPointer/offset notation\n";
for(offset=0; offset<3; offset++)
cout<<"*(aPtr + "<< offset << ") = "<< *(aPtr+offset) << '\n';

return 0;
}

19
13 Αναφορές(References)
Μελετήστε το παρακάτω παράδειγμα πριν το τρέξετε. Τι έξοδο θα βγάλει;

#include <iostream>
using namespace std;
int main()
{
int intOne;
int &rSomeRef = intOne;

intOne = 5;
cout << "intOne: " << intOne << endl;
cout << "rSomeRef: " << rSomeRef << endl;

rSomeRef = 7;
cout << "intOne: " << intOne << endl;
cout << "rSomeRef: " << rSomeRef << endl;
return 0;
}

14 Inheritance
Παρέχεται η παρακάτω δήλωση κλάσης και κληρονομημένης κλάσης. Αναπτύξτε ένα
πρόγραμμα το οποίο θα χρησιμοποιεί και τις δύο κλάσεις.

#include <iostream>
using namespace std;

enum BREED { YORKIE, CAIRN,DANDIE,SHETLAND,DOBERMAN,LAB };


class Mammal {
public:
Mammal();
~Mammal();
int GetAge()const;
void SetAge(int);
int GetWeight() const;
int
void SetWeight();
void Speak();
void Sleep();
protected:
int itsAge;
int itsWeight;
};

class Dog : public Mammal


{
public:

20
Dog();
~Dog();
BREED GetBreed() const;
void SetBreed(BREED);
WagTail();
BegForFood();
protected:
BREED itsBreed;
}

15 Polymorphism
Παρατηρήστε στον ακόλουθο κώδικα πως λειτουργεί ο πολυμορφισμός.

#include <iostream>
using namespace std;
class Horse {
public:
Horse() { cout << "Horse constructor... "; }
virtual ~Horse() { cout << "Horse destructor... "; }
virtual void Whinny() const { cout << "Whinny!... "; }
private:
int itsAge;
};

class Bird {
public:
Bird() { cout << "Bird constructor... "; }
virtual ~Bird() { cout << "Bird destructor... "; }
virtual void Chirp() const { cout << "Chirp... "; }
virtual void Fly() const { cout << "I can fly! I can fly! I can fly! "; }
private:
int itsWeight;
};

class Pegasus : public Horse, public Bird {


public:
void Chirp() const { Whinny(); }
Pegasus() { cout << "Pegasus constructor... "; }
~Pegasus() { cout << "Pegasus destructor... "; }
};

const int MagicNumber = 2;


int main() {
Horse* Ranch[MagicNumber];
Bird* Aviary[MagicNumber];
Horse * pHorse;
Bird * pBird;
int choice,i;

21
for (i=0; i<MagicNumber; i++) {
cout << "\n(1)Horse (2)Pegasus ";
cin >> choice;
if (choice == 2)
pHorse = new Pegasus;
else
pHorse = new Horse;
Ranch[i] = pHorse;
}

for (i=0; i<MagicNumber; i++) {


cout << "\n(1) Bird (2)2 Pegasus: ";
cin >> choice;
if (choice == 2)
pBird = new Pegasus;
else
pBird = new Bird;
Aviary[i] = pBird;
}

cout << "\n";


for (i=0; i<MagicNumber; i++) {
cout << "\nRanch[" << i << "]: " ;
Ranch[i]->Whinny();
delete Ranch[i];
}
}

22

You might also like