C ++ — это статический типизированный язык, почему мы можем получить тип во время выполнения

TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);

Например, мы можем получить тип как это.
C ++ — это статический типизированный язык, почему мы можем получить тип во время выполнения

1

Решение

переменные в 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;    // ???
5

Другие решения

C ++ — это статический язык типов. Это означает, что вы не можете создать новое объявление класса / типа во время выполнения и создать экземпляр объекта / переменной этого, что возможно в Javascript или PHP.

dynamic_cast это часть RTTI, C ++ пытается предоставить информацию о типах во время выполнения. Когда вы бросаете объект через dynamic_castвы не создаете новый тип, вы просто делаете полиморфизм.

Тем не менее, вы можете сказать, что C ++ является как статическим, так и динамическим типом.

2

Похоже, что существует некоторое различие между комментарием (говорят, что объекты имеют статические типы) и ответом (говорят, что переменные имеют статические типы, но объекты не обязательно), я полагаю, что я добавлю свои два цента на предмет.

В 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);

…и актерский состав будет успешным.

2
По вопросам рекламы [email protected]