为什么动态类型在C ++运行时才知道?

时间:2017-01-04 08:53:58

标签: c++ rtti

我已阅读其他问题,例如1347691,并了解动态和静态类型。

但是,我很好奇为什么直到运行时才知道动态类型。毕竟,我们人类可以通过查看代码来决定动态类型。为什么编译器不能这样做?

实际上我们可以使用typeid来决定所谓的运行时类型。 Programming/RTTI

为什么在书" C ++入门5"中,作者仍然说

  

动态类型直到运行时才知道

2 个答案:

答案 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 来替换虚拟调度。