C++是静态类型语言,为什么我们可以在运行时获取类型

C++ is static typed language, why can we get type at runtime

本文关键字:运行时 获取 取类型 我们 静态类 型语言 为什么 C++      更新时间:2023-10-16
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_castRTTI 的一部分,RTTI C++尝试在运行时提供类型的信息。当你通过dynamic_cast投射一个对象时,你不是在创建新类型,你只是在做一个多形的事情。

但是,您可以说C++既是静态类型又是动态类型。

正弦 评论(说对象具有静态类型(和答案(说变量具有静态类型,但对象不一定(之间似乎存在一些分歧(,我想我会在这个问题上投入两美分的价值。

在C++中,变量对象都具有静态类型。当你创建一个对象(例如,无论是全局的、局部的还是用new创建的(,你必须给出其类型的静态规范。

同样,当您创建变量时,它始终具有静态类型。例如,T *xTprime &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);

。演员阵容会成功。