gpt4 book ai didi

java final 方法 vs c++ 非虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:47 25 4
gpt4 key购买 nike

Java final 方法和 C++ 非虚拟方法是不同的还是相同的?怎么办?

最佳答案

它们是不同的。

  • C++ 非虚拟方法不会被分派(dispatch),也不会覆盖任何东西。

  • Java final 方法被分派(dispatch),并且可以覆盖其类父类(super class)中的方法。

但是,它们的相似之处在于 C++ 非虚拟方法和 Java final 方法都不能被覆盖。它们在某种意义上也很相似,如果您有一些静态类型是所讨论类型的对象,则运行时系统不需要分派(dispatch)方法调用。

为了说明差异,请考虑这两个 Java 类:

public class A {
public String toString() {
return "A";
}
}

public class B extends A {
public final String toString() {
return "B";
}
}

A a = ...
B b = ...
a.toString(); // could call A.toString() or B.toString() - dispatch
b.toString(); // could only call B.toString() - no dispatch required
// but it will behave the same as if dispatching had occurred.

在 B::toString() 非虚拟的 C++ 等效项中,我相信 a.toString() 无法分派(dispatch)到 B::toString() . (我对我的 C++ 有点生疏……)


(事实上,Java JIT 编译器能够检测不需要虚拟调度的情况......无需您将类或方法声明为final。因此, final 的真正目的是指定不应重写方法或不应扩展类...并让 Java 编译器为您检查这一点。)

关于java final 方法 vs c++ 非虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5698614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com