ЯП_Си++_03_Наследование
.pdf//операция delete сама вызовет нужный деструктор //(деструкторы должны быть виртуальными) for(int i=0;i<4;i++){
delete massiv[i];
}
21
3.4. Множественное наследование (несколько базовых классов)
class Time{ … };
class Time24: public Time { … }; class Time12: public Time { … };
class TimeUniv: public Time24, public Time12 { … };
У базовых классов Time24 и Time12 есть общий предок Time → производный класс TimeUniv унаследует два экземпляра полей этого предка.
class Time{ … |
}; |
}; |
|
class Time24: virtual public Time { … |
|||
class |
Time12: virtual public Time { … |
}; |
|
class |
TimeUniv: public Time24, public |
Time12 { … }; |
Общий предок определен как виртуальный → класс TimeUniv содержит только один экземпляр полей класса Time
22
class List{// динамический однонаправленный список protected:
struct Elem{//представление одного элемента списка
int key; |
//информативное поле |
Elem* next; //указатель на следующий элемент }; |
|
Elem* first; |
//указатель на первый элемент списка |
Elem* current; |
//указатель на текущий элемент списка |
public: |
//конструктор |
List(); |
|
virtual ~List(); //деструктор |
void operator + (int); |
//добавить перед текущим |
|
void operator - (); |
//удалить текщий |
|
void operator ++ |
(); |
//переместиться на один вправо |
void operator -- |
(); |
//переместиться в начало |
void print(const |
char*); |
|
}; |
|
|
class Stack: public List{// стек |
||
public: |
(int); |
//положить в стек |
void operator << |
||
void operator >> |
(int&); //взять из стека |
|
}; |
|
|
23
//=======Определение методов класса Stack=======
// |
-------положить в стек------- |
|
void Stack::operator << (int d){ |
||
|
-- (*this); |
//переместиться в начало |
|
(* this) + d; //добавить перед текущим |
|
} |
|
//(а он теперь первый) элементом |
|
|
|
// |
-------взять из стека------- |
|
void Stack::operator >> (int &d){ |
||
|
-- (*this); |
//переместиться в начало |
} |
- (*this); |
//удалить текщий (а он теперь первый) элемент |
|
|
24
void instructions(){ printf("************СПИСОК************\n"); printf("1 – добавить перед текущим\n"); printf("2 – удалить текущий\n");
printf("3 – переместиться вправо\n"); printf("4 – переместиться в начало\n"); printf("*************СТЕК*************\n"); printf("5 – положить в стек\n");
printf("6 – взять из стека\n"); printf("*****************************\n");
}
void main(){ Stack st; int d, key; do{
instructions(); key = 0; scanf("%i",&key);
25
switch(key){ case 1:
printf("Элемент: "); scanf("%i",&d);
st + d; st.print("Стек"); break;
//… case 5:
printf("Элемент: "); scanf("%i",&d);
st << d; st.print("Стек"); break;
case 6:
st >> d; st.print("Стек"); break;
}
}while ((key > 0)&&(key < 7));}
26