Xulosa. Dynamic cast nima uchun kerak ?


class A {virtual void f();}


Download 48.58 Kb.
bet3/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 {virtual void f();};
void f() {
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast(pa);
pv = dynamic_cast(pb);
}
Agar bekor bo'lmasa, tomonidan ko'rsatilgan ob'ekt tomonidan ko'rsatilgan turga aylantirilishi mumkinligini type-idtekshirish uchun ish vaqti tekshiriladi . Agar turi ning expressionasosiy sinfi bo'lsa type-id, ish vaqti tekshiruvi expressionaslida turidagi to'liq ob'ektga ishora qiladimi yoki yo'qligini tekshirish uchun amalga oshiriladi type-id. Agar bu to'g'ri bo'lsa, natija turidagi to'liq ob'ektga ko'rsatgich bo'ladi type-id. Masalan:

class B {virtual void f();};
class D : public B {virtual void f();};
void f() {
B* pb = new D;
B* pb2 = new B;
D* pd = dynamic_cast(pb);
D* pd2 = dynamic_cast(pb2);
}
Ushbu turdagi konvertatsiya "pastga tushirish" deb ataladi, chunki u ko'rsatgichni sinf ierarxiyasidan pastga, berilgan sinfdan undan olingan sinfga siljitadi.
Ko'p merosxo'rlik holatlarida noaniqlik uchun imkoniyatlar kiritiladi. Quyidagi rasmda ko'rsatilgan sinf ierarxiyasini ko'rib chiqing.
CLR turlari uchun, dynamic_castagar konversiya bilvosita amalga oshirilishi mumkin bo'lsa, no-op yoki isinstdinamik tekshiruvni amalga oshiradigan va nullptrkonvertatsiya bajarilmasa, qaytariladigan MSIL ko'rsatmalariga olib keladi. Dynamic_castSinf ma'lum turdagi namuna ekanligini aniqlash uchun quyidagi namunadan foydalaniladi :


using namespace System;
void PrintObjectType( Object^o ) {
if( dynamic_cast(o) )
Console::WriteLine("Object is a String");
else if( dynamic_cast(o) )
Console::WriteLine("Object is an int");
}
int main() {
Object^o1 = "hello";

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