inheritance - 我们是否需要检查循环的单继承语言的继承图?

标签 inheritance graph compiler-construction semantics

我正在尝试为“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/

相关文章:

android - 在 MPAndroidChart 中显示单个 x 的多个 y 值

c++ - GCC 编译器错误 : "redefinition...previously defined"

c++ - 继承的构造函数,在 clang++3.9 中编译,在 g++7 中失败

wpf - 在 WPF 中,您可以像使用 Style 一样将一个 DataTemplate 基于另一个 DataTemplate 吗?

c++ - 子类是否分配其祖先的内存和方法?

c++ - 使用 std::function w/std::bind 时的 EXC_BAD_ACCESS

c++ - 全局结构分配给出名称类型错误

java - 如何在 Java 子类中调用 Scala trait 的构造函数?

algorithm - 为图中的每个节点计算距离 n 处的未访问节点

c# - 创建任务管理器之类的图表