TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
Например, мы можем получить тип как это.
C ++ — это статический типизированный язык, почему мы можем получить тип во время выполнения
переменные в C ++ есть статически определенный тип. Объекты не обязательно Вам нужно только справиться объекты через переменные статически известного типа.
Примеры:
int * p = new int[argc]; // there is an object whose dynamic type is int[argc]
Base * p = new Derived; // *p has dynamic type Derived
Base * q = rand() % 2 ? new Derived1 : new Derived2; // ???
C ++ — это статический язык типов. Это означает, что вы не можете создать новое объявление класса / типа во время выполнения и создать экземпляр объекта / переменной этого, что возможно в Javascript или PHP.
dynamic_cast
это часть RTTI, C ++ пытается предоставить информацию о типах во время выполнения. Когда вы бросаете объект через dynamic_cast
вы не создаете новый тип, вы просто делаете полиморфизм.
Тем не менее, вы можете сказать, что C ++ является как статическим, так и динамическим типом.
Похоже, что существует некоторое различие между комментарием (говорят, что объекты имеют статические типы) и ответом (говорят, что переменные имеют статические типы, но объекты не обязательно), я полагаю, что я добавлю свои два цента на предмет.
В C ++ обе переменные а также объекты имеют статические типы. Когда вы создаете объект (например, глобальный, локальный или созданный с new
) вы должны дать статическую спецификацию своего типа.
Аналогично, когда вы создаете переменную, она всегда имеет статический тип. Например, T *x
а также Tprime &y
определять x
как указатель на T
, а также y
в качестве ссылки на TPrime
соответственно.
Единственное, что становится динамичным, это то, что указатель или ссылка могут ссылаться не только на статический тип, для которого он определен, но и также к любому другому типу, производному от этого типа. Переменная типа «указатель на T
«действительно неявно типа» указатель на T
или любое производное T
«(а также со ссылками).
Поэтому, учитывая переменную типа (указатель | ссылка) для T, ссылающуюся на некоторый объект, сам указатель и объект, на который он ссылается, имеют статические типы — но они не обязательно так же статический тип.
dynamic_cast
позволяет определить статический тип объекта, на который имеется ссылка, даже если / если он / может отличаться от статического типа указателя / ссылки, используемой для ссылки на объект. dynamic_cast
также позволяет определить промежуточный тип, который на самом деле не является статическим типом указателя или же объекта, к которому он относится, если иерархия наследования включает некоторый промежуточный тип между ними. Например, учитывая:
struct base {
virtual ~base() {}
};
struct intermediate : base {};
struct derived : intermediate {};
…мы могли бы иметь что-то вроде:
base *b = new derived;
intermediate *i = dynamic_cast<intermediate *>(b);
…и актерский состав будет успешным.