n=Boshi->n_Qiymat();
Element=Boshi;
Boshi=Boshi->Keyingi;
delete Element;
return true;
}
class Stek: public Ruyxat
{
public:
void Joylash(int n);
bool Olish(int& n);
};
void Stek::Joylash(int n)
{
Ruyxat * Yangi;
// Стекнинг янги элементини яратиш
Yangi=new Navbat;
Yangi->Qiymat_n(n);
Yangi->Keyingi=NULL;
// Элементни стек бошига жойлаш
if(Boshi) Yangi->Keyingi=Boshi;
Boshi=Yangi;
if(!Oxiri) Oxiri=Yangi;
}
bool Stek::Olish(int& n)
{
Ruyxat * Element;
if(!Boshi){n=0; return false;}
n=Boshi->n_Qiymat();
Element=Boshi;
Boshi=Boshi->Keyingi;
delete Element;
return true;
}
int main()
{
Ruyxat * ruyxat;
Navbat navbat;
Stek stek;
int son;
char stek_navbat;
cout<<"Sonlarni navbat va stekka joylash:\n";
do
{
cout<<"Sonni kiriting(0-tamom): ";
cin>>son;
if(son)
{
do
{
cout<<"Joylshtirish? Stekka(S) yoki Navbatga(N):";
cin>>stek_navbat;
}
while (stek_navbat!='S' && stek_navbat!='s' &&
stek_navbat!='N' && stek_navbat!='n');
switch(stek_navbat)
{
case 'S':
case 's': ruyxat=&stek; break;
case 'N':
case 'n': ruyxat=&navbat;
}
ruyxat->Joylash(son);
}
} while (son);
for(;;)
{
do
{
cout<<"O'qish? Stekdan(S) yoki Navbatdan(N):\n";
cout<<"Programmadan chiqish (Q):\n";
cin>>stek_navbat;
}
while(stek_navbat!='S' && stek_navbat!='s' &&
stek_navbat!='N' && stek_navbat!='n' &&
stek_navbat!='Q' && stek_navbat!='q');
switch(stek_navbat)
{
case 'S':
case 's': ruyxat=&stek; break;
case 'N':
case 'n': ruyxat=&navbat; break;
case 'Q':
case 'q': return 0;
}
if(ruyxat->Olish(son)) cout<
else cout<<"Ro'yxat bo'sh!"<
}
}
Программа кириш оқимидан бутун сонларни ўқийди ва фойдаланувчи танлаган рўйхатга – навбат ёки стекка жойлаштиради. Сонларни киритиш жараёни навбатдаги сон тариқасида 0 сони киритилганда тўхтайди. Кейинчалик, фойдаланувчи кўрсатган рўйхатдан сон қийматлари ўқилади ва экранга чоп қилинади. Динамик полиморфизм ruxat кўрсаткичи navbat ёки stek объектларига кўрсатишига мос равишда виртуал Olish() ва Joylash() функцияларини чақиришида намоён бўлади.
Виртуал деструкторлар
Конструкторлар виртуал бўлмайди, лекин деструкторлар виртуал бўлиши мумкин ва аксарият ҳолатларда шундай бўлади. Таянч синфига кўрсаткич ҳосилавий синф объектига кўрсатиб турганда, агар деструктор виртуал қилиб эълон қилинган бўлса, ҳосилавий синф деструктори чақирилади. Ҳосилавий синф деструктори ўз навбатида таянч синф деструкторини чақиради ва объект тўғри (тўлалигича) ўчирилади. Акс ҳолда кўрсаткич турига мос равишда таянч синф деструктори чақирилади, ҳосилавий синф учун ажратилган хотира бўшатилмай қолади – хотирада банд қилинган, лекин ишлатилмайдиган хотира бўлаги – «хотира ахлати» пайдо бўлади.
Мисол кўрайлик:
#include
class Tayanch
Do'stlaringiz bilan baham: |