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
,你并没有创建新类型,你只是在做一个多态的事情。
但是,您可以说 C++ 既是静态类型又是动态类型。
当然,评论(说对象具有静态类型)和答案(说变量具有静态类型,但对象不一定)之间似乎存在一些分歧,我想我会在这个主题上投入两分钱。
在 C++ 中,变量和对象都有静态类型。当您创建一个对象时(例如,无论是全局的、本地的还是使用 创建的new
),您必须给出其类型的静态规范。
同样,当您创建变量时,它始终具有静态类型。例如,T *x
和分别Tprime &y
定义x
为指向T
和y
的引用TPrime
。
事情变得动态的一个地方是,指针或引用不仅可以引用为其定义的静态类型,还可以引用从该类型派生的任何其他类型。“pointer to”类型的变量T
实际上是“pointer to”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);
......演员会成功。