Статичный по сравнению с динамическим типом, регистрируясь в C++

Вы могли проверить, существует ли функционально-специализированное к объекту Даты:

function getFormatedDate(date) {
    if (date.getMonth) {
        var month = date.getMonth();
    }
}
11
задан jason 28 August 2009 в 15:25
поделиться

4 ответа

Статическая проверка типа означает, что проверка типа происходит во время компиляции. В этом случае информация о типе не используется во время выполнения.

Динамическая проверка типа происходит, когда информация о типе используется во время выполнения. C ++ использует механизм, называемый RTTI (информация о типе времени выполнения), чтобы реализовать это. Наиболее распространенным примером использования RTTI является оператор dynamic_cast, который позволяет понижать значение полиморфных типов:

// assuming that Circle derives from Shape...
Shape *shape = new Circle(50);
Circle *circle = dynamic_cast<Circle*> shape;

Кроме того, вы можете использовать оператор typeid, чтобы узнать о типе объектов среды выполнения. Например, вы можете использовать его, чтобы проверить, является ли фигура в примере кругом или прямоугольником. Вот некоторая дополнительная информация .

17
ответ дан 3 December 2019 в 04:13
поделиться

В C ++ очень мало поддержки динамической проверки типов: одна - через dynamic_cast , а другая - через идентификатор типа . Оба могут использоваться только при поддержке RTTI включено в компиляторе.

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

Ключевое слово dynamic_cast приводит данные из одного указателя или ссылочного типа к другому, выполняя проверку во время выполнения, чтобы убедиться в правильности преобразования.

Если вы пытаетесь преобразовать указатель в тип, который является не тип фактического объекта, результатом приведения будет NULL. Если вы попытаетесь выполнить приведение для ссылки на тип, не являющийся типом фактического объекта, приведение вызовет исключение bad_cast.

Убедитесь, что в базовом классе есть хотя бы одна виртуальная функция, чтобы динамическая рассылка работала.

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo.h>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main() {
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}
4
ответ дан 3 December 2019 в 04:13
поделиться

Статическая проверка типа - это проверка типа, которая выполняется во время компиляции. Это единственный тип проверки типа, который выполняет C ++. Проверка динамического типа - это проверка типа, выполняемая во время выполнения. Обычно это наблюдается в динамически интерпретируемых языках, но менее распространено в компилируемых языках. Последнее, что я проверял, C ++ не выполняет никакой проверки динамического типа.

Изменить: Очевидно, я устарел. См. Комментарий Рида ниже.

0
ответ дан 3 December 2019 в 04:13
поделиться

В C ++ доступно несколько типов приведений.

Наиболее распространенным было бы использование static_cast для преобразования переменной из одного типа указателя в другой. . Однако вы также можете использовать dynamic_cast , который будет проверять (во время выполнения), что указатели имеют правильный тип. При использовании dynamic_cast, если указатель имеет неправильный тип, во время выполнения он вместо этого вернет 0.

// Assume these classes exist
// class A
// class B
// class C : B

C* c = new C();
A* a = new A();

B* b = static_cast<B*>(a); // this will work!
b = dynamic_cast<B*>(a); // b == NULL
b = dynamic_cast<B*>(c); // b is valid
2
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: