我已阅读其他问题,例如1347691,并了解动态和静态类型。
但是,我很好奇为什么直到运行时才知道动态类型。毕竟,我们人类可以通过查看代码来决定动态类型。为什么编译器不能这样做?
实际上我们可以使用typeid
来决定所谓的运行时类型。 Programming/RTTI
为什么在书" C ++入门5"中,作者仍然说
动态类型直到运行时才知道
答案 0 :(得分:12)
Shape* shape = nullptr;
int userinput = 0;
std::cin >> userinput;
if(userinput == 17)
{
shape = new Circle();
}
else
{
shape = new Square();
}
那么你能告诉我什么类型的形状,从编译时看代码?
答案 1 :(得分:2)
为什么动态类型在C ++运行时才知道?
嗯,这几乎就是动态类型的定义。如果类型在编译时已知,那么它与静态类型的定义没有区别。
实际上我们可以使用
typeid
来决定所谓的运行时类型。
在运行时进行评估。
毕竟,我们人类可以通过查看代码来决定动态类型。为什么编译器不能这样做?
我们人类在考虑该计划可能会遇到的所有过去,当前和未来状态时出了名。很容易错误地假设引用对象的运行时类型。编译器无法承受这样的错误。
但是,有些情况下确实可以在编译时(或可能在链接时)证明对象的动态类型。如果编译器可以在运行时之前证明动态类型,则可以自由地优化代码,就好像类型是静态的一样。编译器可能不会根据此证明更改可观察行为,但它可能会优化掉虚拟函数调用,甚至可以内联扩展函数调用。这是as-if规则允许的,优化称为 devirtualization 。一个简单的例子:
Derived d;
Base b* = &d;
b->virtual_function();
此处,*b
的动态类型为Derived
,并且始终为Derived::virtual_function
,并且很容易证明。可以通过直接调用def func_range(*args):
if not args:
print('Please set the argument')
start, end = args
来替换虚拟调度。