|
Tiplarni dinamik tarzda
|
bet | 3/131 | Sana | 16.06.2024 | Hajmi | 1,92 Mb. | | #264063 |
Bog'liq Tiplarni dinamik tarzda1.2-dastur. Typeid operatorini polimorf sinflar ierarxiyasiga qo‘llanilishi.
#include "stdafx.h"
#include
#include
using namespace std; class Base {
virtual void f() {}; // Asos sinf uchun polimorf
// . . .
};
class myClass_one: public Base {
// . . .
};
class myClass_two: public Base {
// ...
};
int main(){
Base *p, baseob; myClass_one ob1; myClass_two ob2; p = &baseob;
cout << " O'zgaruvchi p tipdagi obyektga ishora: "; cout << typeid(*p).name() << endl;
p = &ob1;
cout << " O'zgaruvchi p tipdagi obyektga ishora: "; cout << typeid(*p).name() << endl;
p = &ob2;
cout << " O'zgaruvchi p tipdagi obyektga ishora: "; cout << typeid(*p).name() << endl;
system("pause"); return 0;}
1.2 – dastur natijasi. Output
O'zgaruvchi p tipdagi obyektga ishora: class Base O'zgaruvchi p tipdagi obyektga ishora: class myClass_one
O'zgaruvchi p tipdagi obyektga ishora: class myClass_two
1.2-dastur tahlili. Dasturda dinamik ko‘rsatkichli Base tipli p o‘zgaruvchisi yaratilgan va 3 ta, base tipiga baseob, myClass_one tipiga ob1, myClass_two tipiga ob2 mos o‘zgaruvchilar yaratilgan. Dastur davomida dinamik o‘zgaruvchiga oddatiy o‘zgaruvchilar qiymat qilib berilgan. Natija shu maʻlum bo‘ldiki dinamik o‘zgaruvchining tipi danamik ko‘rinishda o‘zgardi.
Typeid operatori polimorf turdagi tayanch sinfga ko‘rsatgich sifatida qo‘llanilsa, haqiqiy manzillangan obʻyektning tipini dastur bajarilayotgan vaqtda aniqlaydi.
Typeid operatori polimorf bo‘lmagan iyerarxik sinflar uchun ko‘rsatkich qo‘llaniladigan barcha hollarda, tayanch tipi uchun ko‘rsatikich bo‘ladi. Boshqa so‘zlar bilan aytganda, bu ko‘rsatkich aslida tipni aniqlash mumkin emas. Tajriba sifatida 1.2-dasturdagi asos sinfdagi f() virtual funksiyani izohga oling va natijani tekshirib ko‘ring. Dasturda bu o‘zgarishni amalga oshirgandan so‘ng har bir turli tipli obʻyektning tipi base deb aniqlanishini ko‘rasiz, chunki bu p ko‘rsatgichga ega bo‘lgan tipdir.
Typeid operatori odatda kengqirrali ko‘rsatkich (dereferenced pointer yaʻni, [*] operatoriga ega bo‘lgan ko‘rsatkich) uchun qo‘llanilganligi sababli, bu bu ko‘rsatkich null bo‘lib chiqqanda vaziyatni boshqarish uchun maxsus istisno yaratiladi. Bu holda, typeid operatori bad_typeid istisnoga o‘tadi.
Polimorf sinflar ierarxiyasidagi obʻyektlarga havolalar ko‘rsatgichlar kabi ishlaydi. Typeid operatori polimorf sinfning mos yozuvlar uchun qo‘llaniladigan bo‘lsa, u aslida obʻyekt tipini qaytaradi va u asosiy tipi o‘rniga olingan tipdagi obʻyekt bo‘lishi mumkin. Bu usul o‘zgaruvchilarni funksiyalarga murojaat qilib o‘tishda eng ko‘p qo‘llaniladi. Masalan, quyidagi (1.3-dastur) dasturda WhatType() funksiyasi asosiy tipdagi obʻyektlarga mos yozuvlar parametrini eʻlon qiladi. Demak, WhatType() funksiyasi bazaviy turdagi obʻyektlarga murojaatlarni yoki asos sinfdan olingan har qanday sinf obʻyektlariga murojaatlarni keltirib chiqaradi. Bunday parametrlarga qo‘llaniladigan typeid operatori funksiyaga o‘tgan obʻyektning haqiqiy turini qaytaradi.
|
| |