TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
例如我们可以得到这样的类型。 C ++是静态类型语言,为什么我们可以在运行时获取类型
答案 0 :(得分:5)
变量具有静态确定的类型。 对象不一定。您只需要通过静态已知类型的变量处理对象。
示例:
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; // ???
答案 1 :(得分:2)
C ++是一种静态类型语言。这意味着你不能在运行时创建一个新的类/类型声明,并且实例是它的对象/变量,这在Javascript或PHP中是可能的。
dynamic_cast
是 RTTI 的一部分,C ++尝试在运行时提供类型信息。当您通过dynamic_cast
投射对象时,您不是在创建新类型,而只是做一个多变的事情。
但是,你可以说C ++既是静态类型又是动态类型。
答案 2 :(得分:2)
正如评论(说对象有静态类型)和答案(说变量有静态类型,但对象不一定)之间似乎有一些分歧,我想我会把我的两分钱扔进去主题。
在C ++中,变量和对象都有静态类型。当您创建对象(例如,无论是全局,本地还是使用new
创建)时,您必须提供其类型的静态规范。
同样,当您创建变量时,它始终具有静态类型。例如,T *x
和Tprime &y
将x
定义为指向T
的指针,将y
定义为TPrime
的指针。
事物变得动态的地方是指针或引用不仅可以引用定义它的静态类型,而且也引用从该类型派生的任何其他类型。 “指向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);
......演员会成功。