有没有办法确保成员函数在D中是虚拟的?

有没有办法确保成员函数在D中是虚拟的?,d,D,据我所知,所有成员函数在D中都是虚拟的,但如果编译器发现函数从未被重写,则可以自由地将其设置为非虚拟函数 我不清楚的是,当您编译一个成员函数未被重写的模块,然后将该模块导入到您重写成员函数的其他地方时会发生什么。我认为它不会重新编译原始模块。它只是假设任何具有外部链接的成员函数都是虚拟的吗?默认情况下,所有D成员函数都是虚拟的。我不认为有任何编译器可以将函数作为非虚拟优化。不过,您可以通过将类或函数标记为“final”手动执行此操作。我相信FeepingBioter是正确的,但是,除此之外,我认

据我所知,所有成员函数在D中都是虚拟的,但如果编译器发现函数从未被重写,则可以自由地将其设置为非虚拟函数


我不清楚的是,当您编译一个成员函数未被重写的模块,然后将该模块导入到您重写成员函数的其他地方时会发生什么。我认为它不会重新编译原始模块。它只是假设任何具有外部链接的成员函数都是虚拟的吗?

默认情况下,所有D成员函数都是虚拟的。我不认为有任何编译器可以将函数作为非虚拟优化。不过,您可以通过将类或函数标记为“final”手动执行此操作。

我相信FeepingBioter是正确的,但是,除此之外,我认为您可以假设,如果编译器直接从源代码创建可执行文件,那么这种优化只会被编译器考虑。

FeepingBioter基本上是正确的,除了无法虚拟化的模板函数。

这是如何实现的,是特定于编译器和链接器的。但是,可以优化虚拟函数调用的一种常见情况是,在本地实例化一个类。然后可以在这个范围内直接执行函数调用,因为类的类型在编译时是完全已知的。这可以在编译器级别上完成

除此之外,如果链接器意识到函数实现从未被重写,那么链接器可能会进行优化,并用该类上的直接函数调用替换虚拟函数调用。特别是,如果从未派生类,则可以直接执行对成员函数的所有调用。这就好像链接器会尽可能地插入'final'关键字。(链接器可能不会将此优化应用于导出的类和函数,因为链接器不知道函数是否在其他库或可执行文件中被重写。)