Today I came up with an interesting problem. I noticed that the following code:
class A
{
public A()
{
Print();
}
public virtual void Print()
{
Console.WriteLine("Print in A");
}
}
class B : A
{
public B()
{
Print();
}
public override void Print()
{
Console.WriteLine("Print in B");
}
}
class Program
{
static void Main(string[] args)
{
A a = new B();
}
}
Prints
Print in B
Print in B
I want to know why does it print the “Print in B” twice.
You’re calling a virtual method twice, on the same object. The object is an instance of
Beven duringA‘s constructor, and so the overridden method will be called. (I believe that in C++, the object only “becomes” an instance of the subclass after the base class constructor has executed, as far as polymorphism is concerned.)Note that this means that overridden methods called from a constructor will be executed before the derived class’s constructor body has had a chance to execute. This is dangerous. You should almost never call abstract or virtual methods from a constructor, for precisely this reason.
EDIT: Note that when you don’t provide another constructor call to “chain” to using either
: this(...)or: base(...)in the constructor declaration, it’s equivalent to using: base(). SoB‘s constructor is equivalent to:For more on constructor chaining, see my article on the topic.