施工过程中的虚函数.为什么Java与C++不同

Efi*_* MK 14 c++ java

我今天进行了测试,其中一个问题是在C++构造函数中使用虚方法.我没有这个问题,我回答说,不应该有任何问题,看完之后不过这个我发现我错了.

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

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

Ker*_* SB 15

Java与C++有着截然不同的对象模型.在Java中,您不能拥有类类型对象的变量 - 相反,您只能引用对象(类类型).因此,类的所有成员(仅作为引用)从一开始就开始,null直到整个派生对象已在内存中设置.只有这样才能运行构造函数.因此,当基础构造函数调用虚函数时,即使重写了该函数,重写的函数也至少可以正确引用派生类的成员.(那些成员本身可能尚未被分配,但至少它们存在.)

(如果有帮助,您还可以考虑Java中没有成员的每个final在技​​术上都是默认构造的,至少在原则上是这样的:与C++不同,Java没有常量或引用(必须在C++中初始化),以及实际上根本没有初始化列表.Java中的变量根本不需要初始化.它们或者是从0开始的基元,或者null是从final类开始的类类型引用.一个例外来自非静态类成员,它不能被反弹,必须通过在每个构造函数中的某个地方准确地指定一个赋值语句来"初始化" [感谢@josefx指出这一点!].)