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() {
Do'stlaringiz bilan baham: |