我正在开发针对面向对象语言的编译器,该语言针对我编写的虚拟机,我将其用作跨平台抽象层。 我对继承方法的工作方式感到困惑。 可以说我有以下几行C#代码。

class myObject : Object {
public int aField;
public override string ToString() { 
    return "Dis be mah object";
} 
public void regularMethod() { }
}
Object test = new myObject();
Console.WriteLine(test.ToString());

现在这将输出'Dis be mah object'。 如果我调用regularMethod,但编译后的代码实际上会执行以下操作:

struct myObject {
    public int aField;
}

public static void regularMethod(ref myObject thisObject)
{
}

编译后如何处理继承的方法ToString? 编译器无法完成我在上面使用regularMethod所做的操作,因为如果确实如此,那么只有在创建myObject类型而不是普通的Object类型时才会返回'Dis be mah object'。 我的猜测是struct myObject将包含一个函数指针/委托,它将在创建新实例时分配。

===============>>#1 票数:1 已采纳

如果您正在处理静态重载,那很简单:在处理代码时绑定到正确的实现。

但是,如果您正在使用动态重载,则必须在运行时决定事情。 为此,您需要使用真实对象类型来使用动态分派 这与使用方法覆盖完成的操作相同。

动态调度与后期绑定不同。 在这里,您正在选择一个实现而不是您的操作的名称(尽管这个绑定将在编译时发生,但实现只会在运行时发生)。

静态地,您只能绑定到对象的声明类型的实现。 它在编译时完成。

您可以使用一些机制来实现动态调度,它将决定您的语言范例。

你的语言输入了吗? 弱打字?

例如,C ++提供了我提到的两种类型的调度。 对于动态的(我相信是你感兴趣的那个),它使用虚拟表来为一个类进行映射。 该类的每个实例都将指向一个指向该vtable的指针。

  • 实施

vtable(一个用于同一类的所有对象)将具有所有动态绑定方法的地址。 在进行呼叫时,将从该表中获取其中一个地址。 类型兼容的对象具有表,其地址具有相同的偏移量,用于所有兼容类的方法。

希望我帮了。

  ask by user1454902 translate from so

未解决问题?本站智能推荐:

3回复

编译器优化,线程安全?

我有一个关于编译器可能做的优化的问题。 下面的代码将说明一下(这是一个例子): 编译器是否可以替换最后一行 似乎没有使用-O2或-O3与gcc 4.4的情况,但是其他编译器和其他编译标志可能是这种情况吗?
7回复

示例编译器[关闭]

我正在寻找能够用编程语言从输入程序创建Win32程序的编译器的源代码(哪个更好,也许越简单越好) 然而,我找不到任何适合我的东西,像GCC这样的大型编译器让我非常困惑,因为它们有很多功能,我不知道从哪里开始。 是否有一个OpenSource Win32微编译器用于某些编程语言我可
2回复

如何使用编译器优化此功能?

我一直在学习有关编译器和工具的课程(本学期)。 我阅读了直到生成中间代码,并且还看到了DAG表示的最优性。 编译器很明显的一点是,无论生成了什么中间代码,都必须将其映射到系统的指令集,以便我们可以运行程序。 假设我有一个针对特定体系结构的编译器(例如A),其中两个数字之间的加法是ADD
1回复

有趣的编译器项目

我正在研究编译器中的一个学期长的项目,这个项目也可以演变成我的毕业论文。 我在这个领域没有太多的经验(我为帕斯卡写了一个小的“翻译”,作为我本科工作的一部分) - 我更多的是机器学习和AI。 我们的想法是将此作为一项挑战,并在此过程中学习一些东西。 我确实看过: 有趣的编译器项目 ,但
2回复

将目录上下文传递给编译器

我正在用C语言编写Java编译器,作为休闲项目。 但是,我注意到,当我们在命令行中编译“ gcc example.c”之类的文件时,编译器能够在终端的工作目录中找到example.c而不会出错。 编译器如何知道要搜索example.c的目录? OS是否在编译器的目录中找到example.c
2回复

在Linux中生产可执行文件(与实现编译器有关)

对于我大学的最后一年的论文,我将为骨架形式的C编程语言实现一个编译器,然后继续扩展它,直到它更像Java,类似于数组边界检查,类型检查等等。向前。 我在与编译器构造有关的大部分理论上都比较胜任,并且具有使用MIPS汇编语言进行编程的经验,因此我确实了解编写极端底层代码的含义。 我主要
1回复

编译器中的语义分析[关闭]

如何通过编译器(通常)完成语义分析? 我在上次考试时不得不回答这个问题,这对教授来说还不够。 我在答案中包含了BNF(带有一个例子)和语法卡片,他问我:“当编译器找到像int i;这样的语句时会发生什么?”
1回复

为什么编译器无法自动优化常规递归?

在几乎所有函数式编程教程中,大部分专门用于教您如何将算法转换为尾递归格式,因为这可以优化为循环。 这很好,但它让我想知道为什么编译器不能使用“常规”递归自动转换算法以使用单独的堆栈对象(在堆上分配),然后将算法转换为迭代的算法。 我不完全理解CHICKEN Scheme或Haskel
7回复

现代和旧的编译器是用什么编写的?

作为除解释器之外的编译器,仅需要翻译输入而无需运行输入,其自身的性能就不会像解释器那样有问题。 因此,您不会用Ruby或PHP编写解释器,因为它太慢了。 但是,编译器呢? 如果您使用脚本语言编写编译器,甚至可能具有快速开发的功能,那么您就可以将源代码和初始开发时间减少一半,至少我认
1回复

编译器的哪个阶段检测到以下错误程序?

我在理解编译器阶段中不同错误之间的差异时遇到了一些麻烦,例如以下程序: 我的猜测是这将在语义分析阶段失败,但我不确定(在词法分析阶段是否会失败,因为会生成(int x)的重复标记?) 感谢您的帮助。