gpt4 book ai didi

java - 施工期间的虚拟功能。为什么 Java 不同于 C++

转载 作者:IT老高 更新时间:2023-10-28 22:37:12 25 4
gpt4 key购买 nike

我今天有一个测试,其中一个问题是关于在 C++ 构造函数中使用虚拟方法。这个问题我没有通过,我回答说应该没有问题,但是在阅读this之后我发现我错了。

所以我理解不允许这样做的原因是因为派生对象没有完全初始化,因此调用它的虚方法可能会导致无效的后果。

我的问题是如何在 Java/C# 中解决的?我知道我可以在我的基本构造函数中调用派生方法,我会假设这些语言有完全相同的问题。

最佳答案

Java 的对象模型与 C++ 截然不同。在 Java 中,您不能拥有属于类类型对象的变量——相反,您只能拥有对(类类型)对象的 references。因此,一个类的所有成员(它们只是引用)通常以 null 开始,直到整个派生对象都已在内存中设置。只有这样构造函数才会运行。因此,当基构造函数调用虚函数时,即使该函数被覆盖,被覆盖的函数至少可以正确地引用派生类的成员。 (这些成员自己可能还没有被分配,但至少他们存在。)

(如果有帮助,您还可以考虑在 Java 中没有 final 成员的 每个 类在技术上是默认可构造的,至少在原则上是这样:与 C++ 不同,Java没有常量或引用之类的东西(必须在 C++ 中初始化),事实上根本没有初始化列表。Java 中的变量根本不需要初始化。它们是要么以 0 开头的原语,要么以 null 开头的类类型引用。一个异常(exception)来自非静态 final 类成员,它不能被重新绑定(bind),实际上必须是“初始化”通过在每个构造函数中的某处精确地 one 赋值语句[感谢@josefx 指出这一点!]。)

关于java - 施工期间的虚拟功能。为什么 Java 不同于 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133875/

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