从父类 ctor 调用重写的方法
我尝试从父类的构造函数调用重写的方法,并注意到不同语言的不同行为。
C++
- echoes A.foo()
class A{
public:
A(){foo();}
virtual void foo(){cout<<"A.foo()";}
};
class B : public A{
public:
B(){}
void foo(){cout<<"B.foo()";}
};
int main(){
B *b = new B();
}
Java
- echoes B.foo()
class A{
public A(){foo();}
public void foo(){System.out.println("A.foo()");}
}
class B extends A{
public void foo(){System.out.println("B.foo()");}
}
class Demo{
public static void main(String args[]){
B b = new B();
}
}
C#
- echoes B.foo()
class A{
public A(){foo();}
public virtual void foo(){Console.WriteLine("A.foo()");}
}
class B : A{
public override void foo(){Console.WriteLine("B.foo()");}
}
class MainClass
{
public static void Main (string[] args)
{
B b = new B();
}
}
我意识到,C++对象是从层次结构中最顶层的父级创建的,因此当构造函数调用重写的方法时,B甚至不存在,因此它调用了该方法的A'版本。但是,我不确定为什么我在Java和C#中的行为不同(来自C++)