|
|
|
|
|
#include <iostream.h>
#include <conio.h>
class queue {
int q[10];
int sloc,rloc;
public:
void init(void);
void qput(int i);
int qget(void);
};
//описание
функций членов класса
void queue::init(void)
{
rloc=sloc=0;
}
int queue::qget(void)
{
if(sloc==rloc){
cout<<"очередь
пуста\n";
return 0;
}
return q[rloc++];
}
void queue::qput(int i)
{
if(sloc==10){
cout<<"очередьполна\n";
return;
}
q[sloc++]=i;
}
|
|
|
main(void)
{
queue a,b; //созданы 2
объекта
a.init();
b.init();
//заполнение
очереди а
a.qput(7);
a.qput(9);
a.qput(11);
a.qput(21);
//заполнение
очереди b квадратами
for(int i=0;i<12;i++)
b.qput(i*i);
cout<<a.qget()<<"
";
cout<<a.qget()<<"
";
cout<<a.qget()<<"
";
cout<<a.qget()<<"
";
cout<<a.qget()<<"\n
"<<"теперь в\n";
for(i=0;i<12;i++)
cout<<b.qget()<<"
";
getch();
return
0;
}
|
|
Одним из путей
реализации полиморфизма является перегрузка функций. Две и более функции
могут иметь одно и то же имя, но отличаться друг от друга количеством или типом
параметров. Например, нижеприведенная функция позволяет возводить в квадрат
переменные разных типов:
|
|
|
|
|
#include <iostream.h>
int sqr_it (int i);
double sqr_it (double d);
long sqr_it (long l);
main(void)
{
int i=7;
double d=2.3; long l=20;
cout<< sqr_it ( i ) <<"\n ";
cout<< sqr_it ( d ) <<"\n ";
cout<< sqr_it ( l ) <<"\n ";
cout<< sqr_it (10)
<<"\n ";
cout<< sqr_it (10.1)
<<"\n ";
cout<< sqr_it (70000)
<<"\n " ;
return 0;
}
int sqr_it (int i){
cout<<
"целый аргумент \n ";
return
i*i;
}
double sqr_it (double d){
cout<<
"вещественный аргумент \n ";
return
d*d;
}
long sqr_it (long l)
{
cout<< "аргументтипа
long\n ";
return
l*l;
}
|
|
|
|
Перегружаемые функции
int sqr_it (int i);
double sqr_it (double d);
long sqr_it (long l);
отличаются типом
возвращаемого значения и типом аргумента. Полиморфизм реализуется также перегрузкой
операций. Например, операции << и >> имеют двоякий смысл:
поразрядный сдвиг и оператор ввода/ вывода на консоль.
|
|
|
Наследование
позволяет объединять один класс с другим. В нашем примере с очередью добавим
еще одну функцию, позволяющую находить сумму элементов очереди. В этом случае
можно переписать класс queue или построить новый
класс queue1 на основе уже имеющегося класса с
помощью механизма наследования. Рассмотрим второй вариант.
|
|
|
|
|
//использование
наследования классов
//добавим
функцию вычисления суммы чисел
//в
очереди и вывод этой суммы
#include
<iostream.h>
#include
<conio.h>
class
queue { //объявляем класс
protected:
int
q[10];
int
sloc,rloc;
public:
void
init(void);
void
qput(int i);
int
qget(void);
};
class
queue1:public queue { //объявляемкласс queue1
int
sum; //функции этого класса не имеют доступа к приватной части класса
queue
public:
int
get_sum(void); //подсчетсуммы
void
show_sum(void); //выводсуммы
};
//описание
функций членов класса
void
queue::init(void)
{
rloc=sloc=0;
}
int
queue::qget(void)
{
if(sloc==rloc){
cout<<"очередь
пуста\n";
return
0;
}
return
q[rloc++];
}
|
|
|
void
queue::qput(int i)
{
if(sloc==10){
cout<<"очередьполна\n";
return;
}
q[sloc++]=i;
}
//
описание функций членов класса queue1
int
queue1::get_sum(void)
{
sum=0;
for(int
i=rloc;i<sloc;i++)
sum+=q[i];
return
sum;
}
void
queue1::show_sum(void)
{
cout<<"сумма
очереди -"<< sum<<"\n";
}
main(void)
{
queue1
ob; //созданы 2 объекта
ob.init();
for(int
i=0;i<5;i++){
ob.qput(100+i);
ob.get_sum();
ob.show_sum();
}
for(i=0;i<6;i++){
ob.get_sum();
ob.show_sum();
ob.qget();
}
return
0;
}
|
|
|