覆盖、多态、重载这几个概念非常的类似。下面解释一下它们的区别:
覆盖:
在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,这就是覆盖了。在派生类对象上直接调用这个函数名,只会调用派生类中的那个。
重载:
在基类中定义了一个非虚拟函数,然后在派生类中定义一个同名,但是具有不同的参数表的函数,这就是重载。在派生类对象上调用这几个函数时,用不同的参数会调用到不同的函数,有可能会直接调用到基类中的那个。
多态:
在基类中定义了一个虚拟函数,然后在派生类中又定义一个同名,同参数表的函数,这就是多态。多态是这3种情况中唯一采用动态绑定技术的一种情况。也就是说,通过一个基类指针来操作对象,如果对象是基类对象,就会调用基类中的那个函数,如果对象实际是派生类对象,就会调用派声雷中的那个函数,调用哪个函数并不由函数的参数表决定,而是由函数的实际类型决定。
下面直接用代码说明它们之间的不同。
完全直接覆盖:
class Program
{
static void Main(string[] args)
{
Son s = new Son();
s.Text();
Console.Read();
}
}
class Father
{
public void Text()
{
Console.WriteLine("this is the father's class");
}
}
class Son : Father
{
public void Text()
{
Console.WriteLine("this is the son's class");
}
}

完全覆盖父类定义子类的对象,父类优先
class Program
{
static void Main(string[] args)
{
Father s = new Son();
s.Text();
Console.Read();
}
}

多态:只要有virtual和override,不管使用父类还是子类实例化一个子类对象都调用子类方法,就是子类对父类覆盖
class Program
{
static void Main(string[] args)
{
Father s = new Son();
s.Text();
Console.Read();
}
}
class Father
{
public virtual void Text()
{
Console.WriteLine("this is the father's class");
}
}
class Son : Father
{
public override void Text()
{
Console.WriteLine("this is the son's class");
}
}

子类对父类方法重载:若使用子类中新定义的重载函数,只能用子类实例化一个对象调用
class Program
{
static void Main(string[] args)
{
Son s = new Son ();
s.Text();
s.Text("qqqqqq");
Console.Read();
}
}
class Father
{
public void Text()
{
Console.WriteLine("this is the father's class");
}
}
class Son : Father
{
public void Text()
{
Console.WriteLine("this is the son's class");
}
public void Text(string a)
{
Console.WriteLine(a);
}
}
