Abstrakt sinflar
Hech bo’lmaganda bitta sof virtual usulni o’z ichiga olgan sinf abstrakt sinf deyiladi. Abstrakt sinflar hosilaviy sinflarda konkretlashtirish ko’zda tutilgan umumiy tushunchalarni ifodalash uchun mo’ljallangan. Abstrakt sinf faqat boshqa sinflar uchun bazaviy sinf sifatida foydalanishi mumkin – abstrakt sinfning obyektlarini yaratish mumkin emas, chunki sof virtual usulni to’g’ri yoki bilvosita chaqirish bajarishda xatoga olib keladi.
Absrtakt sinfni aniqlashda quyidagilarga ega bo’lish lozim:
abstrakt sinfni tiplarni oshkora keltirishda parameter tipini va funksiya qaytaruvchi qiymat tipini tavsiflash uchun ishlatib bo’lmaydi;
agar initsializatsiyalashda vaqtli obyekt yaratish talab etilmasa abstrakt sinfga ko’rsatgich va murojaat e’lon qilishga ruxsat beriladi;
agar abstrakt sinf hosila sinfi barcha sof virtual funksiyalarni aniqlamasa, u ham abstrakt hisoblanadi.
Shunday qilib, parametrli abstrakt sinfga ko’rsatgich bo’lgan funksiyani yaratish mumkin. Bu parametr o’rniga dastur bajarilish paytida ixtiyoriy hosila sinf obyektiga ko’rsatgich berilishi mumkin. Bu bir shajara miqiyosida ixtiyoriy tipdagi obyekt bilan ishlaydigan ko’p shaklli (polimorf) funksiyalar yaratishga imkon beradi.
To’plamli vorislik
To’plamli vorislik sinf bir nechta bazaviy sinflarga ega ekanligini bildiradi. Agar bazaviy sinflarda bir xil nomli elementlar bo’lsa, bunda identifikatorlar bahsi ro’y berishi mumkin, u ko’rinish sohasiga kirish amali yordamida bartaraf qilinadi:
class monstr{
public: int get_health();
…
};
class hero{
public: int get_health();
…
};
class ostrich: public monstr, public hero{
…
};
int main(){
ostrich A:
cout << A.monstr::get_health();
cout « A.hero::get__health();
}
Misoldan ko’rinadiki, get_health usulni chaqirish uchun u tavsiflangan sinfni oshkor ko’rsatish talab etiladi. Sinf usulini chaqirish uchun oddiy A.get_health() kontruksiyadan foydalanish xatoga olib keladi, chunki kompilyatsiya bazaviy sinflardan qaysi birining usuliga murojjat talab qilinayotganligini tushuna olmaydi.
Agar bazaviy sinflarda umumiy bobo (predok, grandfather) bo’lsa, bu bazaviy sinflardan hosilalar boboni maydonlari ikki nusxasini meros qilishiga olib keladi, bu esa maqsadga muvofiq emas. Bunday vaziyatdan chiqish uchun umumiy boboni meros qilishda uni virtual sinf kabi aniqlash talab etiladi:
class monstr{
…
};
class daemon: virtual public monstr{
…
};
class lady: virtual public monstr{
…
};
class baby: public daemon, public lady{
…
};
baby sinfi monstr sinfi maydonlarining faqat bir nusxasi. Agar bazaviy sinf ham virtual, ham oddiy tarzda meros qilinsa, hosila sinfda har bir virtual bo’lmagan kirish uchun alohida nusxalar va virtual uchun bitta nusxa qatnashadi.
To’plamli vorislik hosilaviy sinf ikki yoki undan ortiq bazaviy sinflar xossalariga ega bo’lishini ta’minlash uchun qo’llaniladi. Ko’proq bu sinflardan biri asosiy bo’lib, boshqalari ba’zi qo’shimcha xossalarni ta’minlaydi, shuning uchun ular yordamchi sinflar deyiladi. Imkoni boricha yordamchi sinflar virtual bo’lishi lozim, bu esa romb ko’rinishli vorislikda (bazaviy sinflarda umumin bobo bo’lganda) paydo bo’ladigan ko’pgina muammolarni chetlab o’tishga imkon beradi.
Do'stlaringiz bilan baham: |