C中的静态与动态类型检查

新手上路,请多包涵

我想知道什么是静态和动态类型检查以及它们之间的区别。

原文由 rkb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

静态类型检查意味着类型检查发生在编译时。在这种情况下,运行时不使用类型信息。

在运行时使用类型信息时会发生动态类型检查。 C++ 使用一种称为 RTTI(运行时类型信息)的机制来实现这一点。使用 RTTI 的最常见示例是 dynamic_cast 运算符,它允许向下转换多态类型:

 // assuming that Circle derives from Shape...
Shape *shape = new Circle(50);
Circle *circle = dynamic_cast<Circle*> shape;

此外,您可以使用 typeid 运算符来了解对象的运行时类型。例如,您可以使用它来检查示例中的形状是圆形还是矩形。这是一些 进一步的信息

原文由 VoidPointer 发布,翻译遵循 CC BY-SA 2.5 许可协议

假设你有:

 class A {};
class B:A {};

A* a = new B();
B* b = new B();


对于静态类型,你看变量是如何声明的。

 A* a = ...
B* b = ...

So the static type of a is A* (or to put it another way, the static type of *a is A ).

And the static type of b is B* (or to put it another way, the static type of *b is B ).

请注意, ab 具有由其声明固定的静态类型 - 无论您在其中放入什么,它们都将保持相同的静态类型。 (“静态”意味着“不变”)。


对于动态类型,您可以查看变量中发生的情况。

 a = new B();
b = new B();

So the dynamic types of a and b are both B* (or to put it another way, the dynamic types of *a and *b 都是 B )。

请注意,动态类型可以更改 - 如果您更改了 a = new A() 那么它们的动态类型 a 只是更改为 A* 。有时您不知道动态类型是什么 - 例如,如果您执行 a = somefunc() 那么 a 可能具有动态类型 A* B* or even C* (if some code you haven’t seen defines C as a subclass of A or B ).

如果 A 有一个 virtual 方法,那么你可以使用 dynamic_cast 找出动态类型是什么。 (通常,如果您使用这种代码,您希望能够做到 delete a ;为此工作 A 的析构函数必须是 virtual . 并使 A 的析构函数 virtual 足以让 dynamic_cast 工作)。

原文由 user9876 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题