C ++是静态类型语言,为什么我们可以在运行时得到类型(C++ is static typed la

2019-10-18 16:47发布

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

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

Answer 1:

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


Answer 2:

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

dynamic_castRTTI,C ++的尝试,得到的在运行时类型的信息的一部分。 当您通过施放对象dynamic_cast ,没有创建新的类型,你只是做了polymophic事情。

但是,你可以说C ++是静态和动态两种类型。



Answer 3:

正弦似乎有评论之间的一些分歧(话说对象有静态类型)和答案(话说变量有静态类型,但对象不一定),我想我会在我的价值就受到两毛钱丢。

在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);

...和演员会成功。



文章来源: C++ is static typed language, why can we get type at runtime