Kitob uchta qismdan iborat. "Strukturali dasturlash", "Obyektli-yo’nalishli dasturlash", "Standart kutubxonalar"



Download 333,2 Kb.
bet84/90
Sana10.07.2022
Hajmi333,2 Kb.
#770437
1   ...   80   81   82   83   84   85   86   87   ...   90
Bog'liq
C majmua

dynamic_cast amali

Amal shajaraviy turdosh sinflar ko’rsatgichlarini almashtirish uchun asosan – bazaviy sinf ko’rsatgichini hosila sinf ko’rsatgichiga almashtirish hisoblanadi, bunda dasturni bajarish paytida almashtirishning mumkinligi tekshiriladi.


Amal formati:
dynamic_cast (ifoda)
Ifoda sinfga ko’rsatgich yoki murojaat, tip esa – bu sinf uchun bazaviy yoki hosilaviy bo’lishi lozim. Almashtirish mumkinligi tekshirilgandan so’ng muvaffaqiyatli bajarilgan holatda amal berilgan tipdagi natijani shakllantiradi, aks holda ko’rsatgich uchun natija nolga teng, murojaat uchun bad_cast favqulotda holat hosil qilinadi. Agar berilgan tip va ifoda tipi bitta shajaraga tegishli bo’lmasa almashtirishga yo’l qo’yilmaydi.
Bazaviy sinfdan hosila sinfga almashtirish pastga tushiriluvchi (downcast) deb ataladi, chunki shajarada grafik ravishda hosilaviy sinflar bazaviy sinflardan pastda tasvirlash qabul qilingan. Hosilaviy sinfdan bazaviy sinfga keltirish yuqorilashuvchi (upcast), bitta bazaviy sinflar hosilaviy sinflari orasidagi yoki aksincha bir hosila sinf bazaviy sinflar orasidagi keltirish-kesishuvchi (crosscast) deb ataladi.


Yuqorilanuvchi almashtirish

dynamic_cast yuqorilanuvchi almashtirishni bajarish oddiy qymat berishga teng kuchli:


class В{ / * ... * / };
class С: public В{ /* ... */ };
С* с = new С;
В* b = dynamic_cast(c): // В* b = с tengkuchli;
Pastlanuvchi almashtirish

Ko’proq dynamic_cast amali pastlanuvchi almashtirish kompilyator qo’llashning to’g’riligini tekshirish imkoniyatiga ega bo’lmaganda qo’llaniladi.


Hosilaviy sinflar bazaviy sinflarda bo’lmagan funksiyalarni o’z ichiga olishi mumkin. Ularni chaqirish uchun bazaviy sinf ko’rsatgichi orqali bu ko’rsatgich haqiqatda hosila sinf obyektga murojaat qilishiga ishonch hosil qilish lozim. Bunday tekshiruv RTTI (run-time type information) – “dastur bajarilish paytida tip haqida axborot”dan foydalanib tipga keltirishni bajarish paytida amalga oshiriladi. Mumkin bo’lishni tekshirish bajarilishi uchun dynamic_cast amali argumenti polimorf tipida bo’lishi lozim, ya’ni hech bo’lmaganda bitta virtual usulga ega bo’lishi kerak.
Polimorf obyekt uchun dynamic_cast amalini bajarish juda samarali, chunki obyekt tipi haqidagi ma’lumot virtual usullar jadvaliga kiritiladi va unga kirish oson amalga oshiriladi.
Mantiq nuqtai nazaridan obyekt polimorf bo’lish uchun ham haqiqat, chunki agar sinf virtual usullarga ega bo’lmasa, uni xavfsiz ravishda ko’rsatgich tipini aniq bilmasdan ishlatish mumkin emas. Agar tip ma’lum bo’lsa, dynamic_cast amalidan foydalanish zarurati yo’q.
dynamic_cast amalining ko’rsatgichga qo’llash natijasini hammavaqt oshkora tekshirish talab etiladi. Quyida keltirilgan misolda polimorf bazaviy sinf B va unda f2 funksiya aniqlangan hosila C sinf tavsiflangan. Uni demo funksiyadan oxirgisiga hosila sinf obyektiga ko’rsatgich uzatiladi, dynamic_cast amali almashtirish natijasini tekshirish bilan foydalaniladi.
#include
#include
class B{
public: virtual void f l ( ) { };
};
class C: public B{
public: void f2(){cout << "f2";};
};
void demo(B* p){
C* с = dynamic_cast(p);
if (c) c->f2();
else cout << "С sinf uzatilmagan";
}
int main(){
В* b = new В;
demo(b); // " С sinf uzatilmagan" xabari uzatiladi
С* с = new С:
demo(c); // "f2" (to’g’ri) xabari uzatiladi
return 0;
}
Bu misolda dynamic_cast o’rniga C uslubdagi tiplarni keltirishdan foydalanganda, masalan:
C * c = (C*) p;
amalning mumkinligi tekshirishni nazorat qilish mumkin emas va agar p ko’rsatgichga haqiqatda C sinf obyektiga murojaat etmasa bu xatoga olib keladi.
C uslubdagi keltirishning boshqa kamchiligi virtual bazaviy sinfni hosila sinfi alashtirish mumkin emasligi hisoblanadi bu sintaksis jihatdan man etilgan. dynamic_cast amali yordamida bunday almashtirish sinf polimorf va almashtirish ma’noga ega bo’lgan shartda mumkin. Vertual bazaviy sinfni pastlatuvchi lamashtirish bajariladigan misolni qaraymiz:
#include
#include
class A{ // A
public: virtual ~A(){};}; // / \
class B: public virtual A{}; // B C
class C: public virtual A{}; // \ /
class D: public B, public C{}; // D
void demo(A *a){
D* d = dynamic_cast(a);
if (d) { ... }
}
int main(){
D *d = new D; demo(d);
return 0;
}



Download 333,2 Kb.

Do'stlaringiz bilan baham:
1   ...   80   81   82   83   84   85   86   87   ...   90




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish