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

南笙酒味 提交于 2019-12-11 08:57:46

问题


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

For example we can get type like this. C++ is static typed language, why can we get type at runtime


回答1:


Variables in C++ have a statically determined type. Objects don't necessarily. You only need to handle objects through variables of statically known type.

Examples:

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



回答2:


C++ is a static type language. It means you can not create a new class/type declaration in run-time and instance an object/variable of it, which is possible in Javascript or PHP.

dynamic_cast is part of RTTI, the C++ attempt to give information of types in run-time. When you cast an object via dynamic_cast, you aren't creating new type, you're just doing a polymophic thing.

However, you can say C++ is both static and dynamic type.




回答3:


Sine there seems to be some disagreement between a comment (saying objects have static types) and an answer (saying variables have static types, but objects don't necessarily), I guess I'll throw in my two cents worth on the subject.

In C++, both variables and objects have static types. When you create an object (e.g., whether global, local, or created with new) you have to give a static specification of its type.

Likewise, when you create a variable, it always has a static type. For example, T *x and Tprime &y define x as a pointer to T, and y as a reference to TPrime respectively.

The one place things get dynamic is that it's possible for a pointer or reference to refer not only to the static type for which it is defined, but also to any other type derived from that type. A variable of type "pointer to T" is really implicitly of type "pointer to T or any derivative of T" (and likewise with references).

Therefore, given a variable of type (pointer|reference) to T referring to some object, the pointer itself, and the object to which it refers both have static types -- but they aren't necessarily the same static type.

dynamic_cast allows you to determine the static type of the referred-to object, even when/if it is/might be different from the static type of the pointer/reference being used to refer to the object. dynamic_cast also allows you to determine an intermediate type that's not really the static type of the pointer or of the object to which it refers, if the inheritance hierarchy includes some intermediate type between the two. For example, given:

struct base {
    virtual ~base() {}
};

struct intermediate : base {};

struct derived : intermediate {};

...we could have something like:

base *b = new derived;
intermediate *i = dynamic_cast<intermediate *>(b);

...and the cast would succeed.



来源:https://stackoverflow.com/questions/18988046/c-is-static-typed-language-why-can-we-get-type-at-runtime

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!