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

时间:2013-09-24 17:18:51

标签: c++ types static-typing

TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);

例如我们可以得到这样的类型。 C ++是静态类型语言,为什么我们可以在运行时获取类型

3 个答案:

答案 0 :(得分:5)

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;    // ???

答案 1 :(得分:2)

C ++是一种静态类型语言。这意味着你不能在运行时创建一个新的类/类型声明,并且实例是它的对象/变量,这在Javascript或PHP中是可能的。

dynamic_cast RTTI 的一部分,C ++尝试在运行时提供类型信息。当您通过dynamic_cast投射对象时,您不是在创建新类型,而只是做一个多变的事情。

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

答案 2 :(得分:2)

正如评论(说对象有静态类型)和答案(说变量有静态类型,但对象不一定)之间似乎有一些分歧,我想我会把我的两分钱扔进去主题。

在C ++中,变量对象都有静态类型。当您创建对象(例如,无论是全局,本地还是使用new创建)时,您必须提供其类型的静态规范。

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

......演员会成功。