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

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

4

3 回答 3

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;    // ???
于 2013-09-24T17:20:46.157 回答
3

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

dynamic_castRTTI的一部分,C++ 尝试在运行时提供类型信息。当你通过 投射一个对象时 dynamic_cast,你并没有创建新类型,你只是在做一个多态的事情。

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

于 2013-09-24T17:29:23.397 回答
3

当然,评论(说对象具有静态类型)和答案(说变量具有静态类型,但对象不一定)之间似乎存在一些分歧,我想我会在这个主题上投入两分钱。

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

同样,当您创建变量时,它始终具有静态类型。例如,T *x和分别Tprime &y定义x为指向Ty的引用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);

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

于 2013-09-24T17:37:35.457 回答