慕瓜9086354
Java和C++在构造函数中调用虚函数的区别首先可以认为,Java所有instance函数都是虚函数。C++类的构造函数中调用虚函数,并不能有多态效果。这样设计的理由是:在基类的构造函数中,派生类的成员尚未初始化,而派生类的虚函数定义可以使用派生类的成员,C++强制必须先初始化对象然后才能使用【这是C++设计new和构造函数的初衷】,所以不可以调用派生类的虚函数定义。C++虚函数的实现机制也可以解释这一现象:对象的虚函数表指针在调用构造函数前更新,指向该类的虚函数表。所以当调用基类的构造函数时,对象的虚函数表指针指向该基类的虚函数表,而不是指向派生类的虚函数表,所以虚函数调用没有多态效果。但是Java类的构造函数中调用虚函数,依然有多态效果。我是在看《The Java Programming Language, fourth edition》5.5 Inheriting Nested Types 这一节时看到了在Field initializer中调用【虚】函数,仍然有多态的效果,大吃一惊,经验证属实。《Thinking in Java, fourth edition》 Behavior of polymorphic methods inside constructors 这一节对此进行了评论:If you call a dynamically-bound method inside a constructor, the overridden definition for that method is used. However, the effect of this call can be rather unexpected because the overridden method will be called before the object is fully constructed. This can conceal some difficult-to-find bugs.总之,这是一把双刃剑,有利有弊,且弊大于利,要小心使用。《The Java Programming Language, fourth edition》5.5 Inheriting Nested Types 这一节举的例子可以使用两步初始化的方法解决,也可以使用延迟创建的方法解决,延迟创建是更好的办法。C++ 的不懂..帮你找了一下