我想知道什么是静态和动态类型检查以及它们之间的区别。
原文由 rkb 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设你有:
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
).
请注意, a
和 b
具有由其声明固定的静态类型 - 无论您在其中放入什么,它们都将保持相同的静态类型。 (“静态”意味着“不变”)。
对于动态类型,您可以查看变量中发生的情况。
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 许可协议
3 回答1.4k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
4 回答917 阅读
1 回答987 阅读
1 回答1k 阅读
1 回答775 阅读
1 回答877 阅读
静态类型检查意味着类型检查发生在编译时。在这种情况下,运行时不使用类型信息。
在运行时使用类型信息时会发生动态类型检查。 C++ 使用一种称为 RTTI(运行时类型信息)的机制来实现这一点。使用 RTTI 的最常见示例是 dynamic_cast 运算符,它允许向下转换多态类型:
此外,您可以使用 typeid 运算符来了解对象的运行时类型。例如,您可以使用它来检查示例中的形状是圆形还是矩形。这是一些 进一步的信息。