在Java和C++中,从构造函数调用被覆盖的方法有所不同。有人能解释一下它们的调度方法为什么不同吗?
我知道C++和Java的设计和演变方式不同。但是当涉及到从构造函数调用可重写方法时,了解语言规范故意这样设计的原因会有所帮助。
我的研究动机是ErrorProne检查: http://errorprone.info/bugpattern/ConstructorInvokesOverridable
以下是返回1的Java代码:
class Ideone
{
static class Simple {
public int i;
Simple() {
this.i = func();
}
public int func() {
return 2;
}
}
static class Complex extends Simple {
@Override
public int func() {
return 1;
}
}
public static void main (String[] args) throws java.lang.Exception
{
Complex c = new Complex();
System.out.println(c.i);
}
}
这里是返回2的C++代码
#include <iostream>
using namespace std;
class Simple {
public:
Simple(int i) { i_ = func(); }
virtual int func() { return 2; }
int i_;
};
class Complex : public Simple {
public:
Complex(int i) : Simple(i) {}
int func() override { return 1; }
};
int main() {
// your code goes here
Complex complex(2);
printf("Val is : %d\n", complex.i_);
return 0;
}