C++是静态类型语言,为什么我们可以在运行时获取类型
C++ is static typed language, why can we get type at runtime
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_cast
是 RTTI 的一部分,RTTI C++尝试在运行时提供类型的信息。当你通过dynamic_cast
投射一个对象时,你不是在创建新类型,你只是在做一个多形的事情。
但是,您可以说C++既是静态类型又是动态类型。
正弦 评论(说对象具有静态类型(和答案(说变量具有静态类型,但对象不一定(之间似乎存在一些分歧(,我想我会在这个问题上投入两美分的价值。
在C++中,变量和对象都具有静态类型。当你创建一个对象(例如,无论是全局的、局部的还是用new
创建的(,你必须给出其类型的静态规范。
同样,当您创建变量时,它始终具有静态类型。例如,T *x
和 Tprime &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);
。演员阵容会成功。
- 在Hackerearth上获取运行时错误(SIGSEGV),无法找出代码中的问题
- 获取指向派生类的指针在 C++ 中以运行时异常结束
- C++ 在运行时获取具有 ID 的对象
- 获取派生模板实例化的运行时类型
- 如何在运行时从平面缓冲区获取数据值和数据类型
- 在运行基本 Avx512 代码时获取非法指令
- 如何处理在 bash 文件中获取运行时输入的 c++ 程序
- 在运行时获取可用的库函数
- 在运行时获取/设置模板结构的静态成员
- 如何在运行时获取对象的总大小
- 在运行时获取元组中索引的类型
- 有没有一种方法可以在编译时加载到omp.h中,因此机器永远不需要在运行时获取它
- 在运行时获取类型参数
- 如何在 OpenCL 中运行时获取计算单元 ID
- 如何在运行时获取许多对象之一的句柄
- 如何在运行时获取虚函数指针的确切类型
- C++是静态类型语言,为什么我们可以在运行时获取类型
- Linux gnu++11,在运行时获取"Enable multithreading to use std::thread: Operation not permitted"
- 正在运行时获取模板类型
- 在运行时获取名称空间中的函数列表