Xulosa. Dynamic cast nima uchun kerak ?


class A {virtual void f();}


Download 48.58 Kb.
bet5/7
Sana28.12.2022
Hajmi48.58 Kb.
#1011767
1   2   3   4   5   6   7
Bog'liq
Dynamic cast

class A {virtual void f();};
class B : public A {virtual void f();};
class C : public A { };
class D {virtual void f();};
class E : public B, public C, public D {virtual void f();};

void f(D* pd) {
B* pb = dynamic_cast(pd); // o'zaro to'qnashuv
A* pa = pb; // yuqoriga ko'tarilgan, yashirin konvertatsiya
}
Null ko'rsatkich qiymati maqsad turining null ko'rsatkich qiymatiga tomonidan aylantiriladi dynamic_cast. dan foydalanganda 
dynamic_cast < type-id > ( expression ), agar expressionturiga xavfsiz tarzda aylantirib bo'lmasa type-id, ish vaqtini tekshirish translatsiyani muvaffaqiyatsizlikka olib keladi. Masalan:
class A {virtual void f();};
class B {virtual void f();};
void f() {
A* pa = new A;
B* pb = dynamic_cast(pa); // ish vaqtida muvaffaqiyatsiz tugaydi, xavfsiz emas;
// B A dan kelib chiqmagan
}
Ko'rsatkich turiga o'tkazib yuborilgan muvaffaqiyatsizlik qiymati null ko'rsatkichdir. Muvaffaqiyatsiz uzatish turiga mos yozuvlar bad_cast istisnosini keltirib chiqaradi . Agar expressionto'g'ri ob'ektga ishora qilmasa yoki unga havola qilmasa, __non_rtti_object istisno chiqariladi.
Istisnoni tushuntirish uchun typeid ga qarang __non_rtti_object.

Misol :
Quyidagi namuna ob'ektga (S strukturasi) asosiy sinf (struct A) ko'rsatgichini yaratadi. Bu, shuningdek, virtual funktsiyalar mavjudligi, ish vaqti polimorfizmini ta'minlaydi.
Namuna ierarxiyadagi virtual bo'lmagan funksiyani ham chaqiradi.


#include
#include
struct A {
virtual void test() {
printf_s("in A\n");
}};
struct B : A {
virtual void test() {
printf_s("in B\n");
}
void test2() {

Download 48.58 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7




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