Вы могли проверить, существует ли функционально-специализированное к объекту Даты:
function getFormatedDate(date) {
if (date.getMonth) {
var month = date.getMonth();
}
}
Статическая проверка типа означает, что проверка типа происходит во время компиляции. В этом случае информация о типе не используется во время выполнения.
Динамическая проверка типа происходит, когда информация о типе используется во время выполнения. C ++ использует механизм, называемый RTTI (информация о типе времени выполнения), чтобы реализовать это. Наиболее распространенным примером использования RTTI является оператор dynamic_cast, который позволяет понижать значение полиморфных типов:
// assuming that Circle derives from Shape...
Shape *shape = new Circle(50);
Circle *circle = dynamic_cast<Circle*> shape;
Кроме того, вы можете использовать оператор typeid, чтобы узнать о типе объектов среды выполнения. Например, вы можете использовать его, чтобы проверить, является ли фигура в примере кругом или прямоугольником. Вот некоторая дополнительная информация .
В 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;
}
Статическая проверка типа - это проверка типа, которая выполняется во время компиляции. Это единственный тип проверки типа, который выполняет C ++. Проверка динамического типа - это проверка типа, выполняемая во время выполнения. Обычно это наблюдается в динамически интерпретируемых языках, но менее распространено в компилируемых языках. Последнее, что я проверял, C ++ не выполняет никакой проверки динамического типа.
Изменить: Очевидно, я устарел. См. Комментарий Рида ниже.
В 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