调度和继承(静态与动态类型)

时间:2014-04-03 23:32:24

标签: types compiler-construction

所以在我的编译器类中,我们查看了代码

p : Point;
p <- new ColorPoint;

这里p被声明为Point,但是被赋予了ColorPoint对象,而ColorPoint是Point的子类。

教师说p有静态类型Point,但它有动态类型ColorPoint。他说这是因为编译器不知道p在编译时是一个ColorPoint,它只在运行时发现它。这是为什么?编译器不能看到p被分配了一个ColorPoint对象吗?

1 个答案:

答案 0 :(得分:0)

是的,在这种情况下它可以,但如果你有

那会怎么样
p : Point;
p <- new ColorPoint;
// some statements that operate on p
p <- new BlackAndWhitePoint;
// some more statements that operate on p

通常,编译器无法推断使用变量的整个上下文,因此必须使用声明的类型。