ЕСКЕРТУ
RTTI ақпаратын қолдану үшін программаға
тақырыптық файлын қосу
керек. Сонымен қатар, компилятордың соған сəйкес режимі де орнатылуы тиіс.
Полиморфты объект үшін
dynamic_cast
операциясының жүзеге асыры-
луы айтарлықтай тиімді болады, өйткені объектінің типі туралы ақпаратқа
сілтеме виртуалды əдістер кестесіне енгізіледі де, оған қол жеткізу жеңіл іске
асырылады.
Логикалық тұрғыдан алғанда да, объектінің полиморфты болу талабы
дұрыс шешім болып табылады: егер кластың виртуалды əдістері болмаса,
нұсқауыштың нақты түрдегі типін білместен, оны қауіпсіз түрде қолдану
мүмкін емес. Ал егер тип белгілі болса, онда
dynamic_cast
операциясын
қолданудың қажеті жоқ.
Нұсқауышқа
dynamic_cast
операциясын қолданудың нəтижесін
əрқашанда нақты түрде тексеру керек. Төмендегі мысалда
В
полиморфты
базалық класы жəне одан туынды болып келетін, құрамында
f2
функция-
сы анықталған
С
класы сипатталған.
demo
функциясынан туынды класс
объектісіне нұсқауыш берілген жағдайда ғана
f2
функциясын
demo
функ-
циясынан шақыру үшін түрлендіру нəтижесінің тексерілуі орындалатын
dynamic_cast
операциясы қолданылады:
#include
#include
class B{
public: virtual void f1(){};
};
class C: public B{
public: void f2(){cout << "f2";};
};
void demo(B* p){
C* c = dynamic_cast(p);
if (c) c->f2();
else cout << "Берілген С класы емес";
}
int main(){
B* b = new B;
demo(b); // "Берілген С класы емес"
// хабарламасы шығарылады
Достарыңызбен бөлісу: |