Object^o2 = 10;
PrintObjectType(o1);
PrintObjectType(o2);
}
Ushbu ierarxiyada A virtual tayanch sinf mavjud. Sinf misoli E va pastki ob'ektga ko'rsatgich berilgan bo'lsa A, noaniqlik tufayli dynamic_cast a ko'rsatgich muvaffaqiyatsiz bo'ladi. Avval to'liq ob'ektga qaytishingiz kerak E, so'ngra to'g'ri ob'ektga erishish uchun ierarxiya bo'ylab bir ma'noda orqaga qaytishingiz kerak B.
Quyidagi rasmda ko'rsatilgan sinf ierarxiyasini ko'rib chiqing.
Ikki nusxadagi asosiy sinflarni ko'rsatadigan sinf ierarxiyasi
Ob'ekt turi E va pastki ob'ektga ko'rsatgich berilgan holda, pastki ob'ektdan eng chap tomondagi pastki ob'ektga D o'tish uchun uchta konvertatsiya qilish mumkin. Siz ko'rsatgichdan ko'rsatkichga o'zgartirishni, so'ngra dan ga o'zgartirishni (yoki yashirin konvertatsiyani) va nihoyat dan ga o'zgartirishni amalga oshirishingiz mumkin .
Masalan: D A dynamic_cast D E dynamic_cast E B B A .
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) {
E* pe = dynamic_cast(pd);
B* pb = pe; // yuqoriga ko'tarilgan, yashirin konvertatsiya
A* pa = pb; // yuqoriga ko'tarilgan, yashirin konvertatsiya
}
Operatordan dynamic_cast "o'zaro to'qnashuv" ni bajarish uchun ham foydalanish mumkin. B Xuddi shu sinf ierarxiyasidan foydalanib, to'liq ob'ekt turi bo'lsa, ko'rsatgichni, masalan, pastki ob'ektdan pastki ob'ektga D o'tkazish mumkin E.
D O'zaro o'tishlarni hisobga olsak, ko'rsatgichdan ko'rsatkichga eng chap A pastki ob'ektga o'tkazishni faqat ikki bosqichda amalga oshirish mumkin . D dan ga o'zaro o'tishni , so'ngra dan ga B bilvosita aylantirishni amalga oshirishingiz mumkin . Masalan: B A
Do'stlaringiz bilan baham: |