基类中的函数 加virual 修饰

来源:百度知道 编辑:UC知道 时间:2024/06/09 15:13:20
基类中的函数 加virual 修饰

除了在重写的时候用override关键词而不是new 外

还有啥用

virtual
虚拟方法申明的关键字

用我自己的话来陈述:
在基类无法得知子类该如何定义该函数时,可以使用虚拟方法,这叫【运行时多态】,也就是说,运行的时候编译器会自动根据调用该函数的类型,去执行该类型的函数体,

举例来说,
【图形】是基类
【三角形】是图形的子类
【圆形】也是图形的子类
那么【图形】这个类可以定义一个虚拟方法得到这个图形的面积:
public virtual float GetArea()
{
............
}
但【图形】这个类本身无法实现这个函数(因为不知道该用哪个公式得出面积),那么在【图形】的子类(【三角形】和【圆形】)中,就可以继承这个函数,并实现:
//三角形:
public override float GetArea()
{
return h*w/2;
}

//圆形
public override float GetArea()
{
return Math.PI*r*r;
}

这样的话,圆形和三角形就可以计算自己的面积了:
图形 三角形1=new 三角形();
图形 圆形1=new 圆形();
float s1=三角形1.GetArea();
float s2=圆形1.GetArea();

注意:
为什么说是【运行时多态】?
因为:图形 三角形1=new 三角形();
编译的时候并不知道【三角形1】的实际类型是什么?加virtual 关键字的意义是告诉编译器:我无法得知【三角形1】的类型,要在运行时才能得到,

为什么要用:图形 三角形1=new 三角形();
而不用:三角形 三角形1=new 三角形();
因为new 三角形();有可能是外界传过来的一个参数,我们无法确定他的具体类型,所以只能用基类类型去构造,

好象是虚函