Я попытался вызвать переопределенный метод из конструктора родительского класса и заметил различное поведение на разных языках.Вызов переопределенного метода из родительского класса ctor
C++
- эхо 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
- эхо 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#
- эхо 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++)
Не вызывайте виртуальную функцию в конструкторе C++ ... http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.7 –
Вопрос - странный вопрос. C# и C++ - разные языки, поэтому, конечно, у них разные правила. Если бы они имели те же правила *, то они были бы * одним и тем же языком *. Почему * должен * C# следовать правилам C++? –
Связанное сообщение my на конструкторах Java и шаблоне шаблона шаблона: http://novyden.blogspot.com/2011/08/java-anti-pattern-constructors-and.html – topchef