首先看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
public class myBase
{
public myBase()
{
printField();
}
public virtual void printField()
{
Console.WriteLine("base is called");
}
}
public class client:myBase
{
public int i = 0;
public int j;
public client()
{
j = -1;
}
public override void printField()
{
Console.WriteLine("i = {0}, j={1}",i,j);
}
}
class Program
{
static void Main(string[] args)
{
client t = new client();
t.printField();
}
}
}
当我刚开始学习的时候我的答案为:
base is called
x=0,y=-1;
其实正确的答案为:
x=0,y=0;
x=0,y=-1;
解惑:
刚开始得出这个结果的时候,好使让我费解了。为什么?c++会是这样么。不是的。c++的答案是第一个。因为c++在类中只能声明。
搞了好久,采取请教下大神。原来在实现重写的时候,c#的底层会把基类的虚函数从虚拟指针表中重写掉。所以在调用基类的默认构造函数(实例化继承类时)调用的
printField() 函数实际上是继承类中的printField()