最简单的继承
class Class2:Class1
{
}
表示class2继承自class1.
父类和子类中难免会存在同名的函数成员,这时候就会用到虚函数和隐藏函数。
虚函数
class Class1
{
public virtual void function()
{
Console.WriteLine("function1");
}
}
class Class2:Class1
{
public override void function()
{
Console.WriteLine("function2");
}
}
隐藏函数
class Class1
{
public void function()
{
Console.WriteLine("function1");
}
}
class Class2:Class1
{
public new void function()
{
Console.WriteLine("function2");
}
}
注意只要子类中的同名函数前面没有override,一律会被视作隐藏函数。
不管是虚函数还是隐藏函数,子类对象调用的都是子类中的函数。如果父类对象是用父类声明的也一定是调用父类中的函数。
当子类对象用父类声明子类定义,如果子类中的是隐藏函数,则会调用父类的函数,如果是虚函数则会使用子类的方法。
当子类对象使用子类中没有定义的方法时,会逐级向上查找。
图片源自:https://www.cnblogs.com/gygg/p/11556005.html
当用子类赋值父类对象时
static void Main(string[] args)
{
Class2 b=new Class2();
Class1 a = b;
a.function();
b.function();
}
若使用虚函数则输出为function2 function2
若使用隐藏函数 则输出function1 function2
原理与上面类似。
如果用子类赋值父类对象
class Program
{
static void Main(string[] args)
{
Class2 b=new Class2();
Class1 a = b;
b.Data1 = 1;
a.Data1 = 2;
Console.WriteLine("b.Data1= " + b.Data1);
Console.WriteLine("a.Data1= " + a.Data1);
}
}
类是引用,当b赋值a时,实际上赋值的是b的地址,此时ab指向的是同一个对象,所以当a的data赋值2时,b的data也赋值2。
注意结构体和类不同,是值类型。
输出为
b.Data1= 2
a.Data1= 2