Xulosa. Dynamic cast nima uchun kerak ?
class A {virtual void f();}
Download 48.58 Kb.
|
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 pv = dynamic_cast } 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 D* pd2 = dynamic_cast } 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 Console::WriteLine("Object is a String"); else if( dynamic_cast Console::WriteLine("Object is an int"); } int main() { Object^o1 = "hello"; Download 48.58 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling