看了一下帖子,关于 op 的问题已经很好地回答了。主要的冲突在于 op 说 c++的行为要比 java 的行为更符合直觉。
是否符合直觉是一个很主观的问题,但确实是编程语言设计时一个重要的参考标准之一,在降低学习成本,减少程序员犯错的几率方面非常重要。
一种很正常的观点是,在这个问题上保持行为一致会更容易理解:如果一个方法被声明可以重写,那么就总是调用被重写的最终版本。从这个角度来说,c++引入了不一致,不符合直觉。
但是,在父类构造函数中调用子类方法,此时子类的成员变量尚未初始化。程序员如果没有意识到这一点,就非常容易犯错。这里要 @
Opportunity ,关于构造函数只是 inintializer 的观点是错误的,至少 java 这里不是。
更好的方式是,构造函数只应该做构造函数的事情,它不应该调用子类的方法,因为子类的构造不归它管。它更不应该去执行与构造无关的初始化逻辑,这些逻辑应该被放在 inintializer 里。如果子类要干预父类的构造,应该在自己的构造函数里去做。因此,与父类构造函数相关的逻辑都不应该被子类重写。从这个角度来看,c++的行为反而更符合直觉。
因此我代表个人投 c++一票。