C#中的虚函数virtual
<h3>简单介绍虚函数virtual</h3><p>在某基类中声明 virtual 并在一个或多个派生类中被重新定义的成员函数称为虚函数。</p>
<p>虚函数的作用就是实现多态性(Polymorphism),多态性是将接口与实现进行分离。</p>
<p>C#作为完全面向对象语言,所有函数并不默认为virtual,但可以在基类中声明关键字virtual,就可以在其派生类中通过关键字override重写该函数。重写后的virtual函数依旧是virtual函数。由于virtual只对类中的实例函数成员有意义,所以成员字段和静态函数都不能声明为virtual,也不能与override和abstract一起用。</p>
<h3>虚函数与一般函数的区别</h3>
<p>一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中声明时定义的类叫声明类,执行时实例化的类叫实例类。</p>
<h3>使用虚函数virtual</h3>
<p>1、当调用一个对象的函数时,系统会直接去检查这个对象声明定义的类,即声明类,看所调用的函数是否为虚函数。</p>
<p>2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。</p>
<p>3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果有,则马上执行该实例类中的这个重新实现的函数。而如果没有,系统会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。</p>
<p><strong><span style="font-size: 16px">实例:</span></strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1732950/201909/1732950-20190923175031034-342670872.png" alt=""></p>
<p><strong><span style="font-size: 16px">运行结果:</span></strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1732950/201909/1732950-20190920173836723-824754723.png" alt=""></p>
<p><span style="font-size: 16px"><strong>常见面试题:</strong></span></p>
<pre class="brush: c-sharp;html-script: false;quick-code: true;smart-tabs: true;auto-links: false;toolbar: true;gutter; true;light: false;ruler: false;pad-line-numbers: 2;collapse: false;tab-size: 4;first-line: 1;">class Program
{
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
static void Main(string[] args)
{
new B();
}
}</pre>
<p>问:当使用new B()创建B的实例时,产生什么输出?</p>
<p>答:x=1,y=0</p>
<p>解析:创建B的实例,先隐式调用父类A的无参构造函数,执行PrintFields()方法,检查到是虚方法,转去检查实例类B,有重载方法,执行重载方法,输出x=1,y=0</p>
<p><span style="color: rgba(255, 0, 0, 1)">注意:创建子类对象时会首先调用父类的构造函数,然后才会调用子类本身的构造函数,</span><span style="color: rgba(255, 0, 0, 1)">如果没有指明要调用父类的哪一个构造函数,系统会隐式地调用父类的无参构造函数</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">End!</span></p>
</div>
<div id="MySignature" role="contentinfo">
<div>作者:Wahaha、</div>
<div>出处:https://www.cnblogs.com/gygg/</div>
<div>本博客是作者在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处。</div><br><br>
来源:https://www.cnblogs.com/gygg/p/11556005.html
頁:
[1]