我正在尝试为“COOL”语言编写一个编译器。正如这种语言的手册中所写,每个类最多只能有一个父类,而无父类是“对象”类的子类。
对于编译器的语义分析阶段,我们需要检查继承层次中是否没有循环。例如,如果 a 类是 b 类的父类,b 类是 c 类的父类,则 c 类不能是 a 类的父类!
但我逐渐意识到,对于单继承语言,如果我们将“object”作为父类,则继承图中不可能存在循环。我们只需要看看代码中是否没有任何地方,是否有人为“对象”声明了父亲!
我说得对吗?
最佳答案
考虑以下两个类:
class A extends B {}
class B extends A {}
在某些语言中,尤其是 C++,上述内容是非法的,因为您不能在 B 声明之前引用它,也不能从仅被前向声明的类继承。所以在这样的语言中,不需要明确的循环检查,因为在不遇到其他错误的情况下构建这样的循环是不可能的。
然而,在许多其他语言中,包括 Java、C# 和可能的 COOL,完全有可能继承仅在文件后面定义的类(或在不同的文件中而不用担心包含顺序)。因此在这些语言中,上述代码将是合法的,除非编译器明确检测到循环并因此拒绝代码。
关于inheritance - 我们是否需要检查循环的单继承语言的继承图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27545288/