253
С* с = (С*) р;
операцияның орындалу мүмкіндігін қадағалау мүмкін емес жəне
р
нұсқауышы
С
класының объектісіне сілтеме жасамайтын болса, бұл қателіктің
пайда болуына алып келеді.
С стилінде түрлендірудің тағы бір кемшілігі – виртуалды базалық кла-
сты туынды класқа түрлендіру мүмкін емес, бұған синтаксистік түрде тыйым
салынған. Мұндай түрлендіру класс полиморфты жəне түрлендіру екімағыналы
болмаған жағдайда,
dynamic_cast
операциясының көмегімен орындалуы
мүмкін
. Виртуалды базалық кластың төмендететін түрлендірілуі орында-
латын мысалды қарастырайық:
#include
#include
class A{ // A
public: virtual ~A(){};}; // / \
class B: public virtual A{}; // B C
class C: public virtual A{}; // \ /
class D: public B, public C{}; // D
void demo(A *a){
D* d = dynamic_cast(a);
if (d) { ... }
}
int main(){
D *d = new D; demo(d);
return 0;
}
Сілтемелерді түрлендіру
Аргумент-сілтеме үшін түрлендіру операциясының мағынасы
нұсқауыштарқа қарағанда өзгешелеу болып келеді. Сілтеме əрқашанда
нақты көрсетілетін объектіге нұсқайтын болғандықтан,
dynamic_cast
опе-
рациясы дəл осы объектінің типіне түрлендіруді орындауы керек. Келтіру
операциясының дұрыстығы автоматты түрде тексеріледі, сəйкессіздік
жағдайында
bad_cast
аластамасы туындайды:
Достарыңызбен бөлісу: