TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
例如,我们可以得到这样的类型。 C ++是静态类型语言,为什么我们可以在运行时得到类型
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
,没有创建新的类型,你只是做了polymophic事情。
但是,你可以说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);
...和演员会成功。