黑马程序员技术交流社区

标题: 虚方法 [打印本页]

作者: 冉贵阳    时间: 2012-4-10 08:57
标题: 虚方法
什么是类的虚方法?在具体应用中有什么作用?
作者: 张云静    时间: 2012-4-10 09:09
虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类。
如:飞禽 bird = new 麻雀();那么飞禽就是申明类,麻雀是实例类。
具体的检查的流程如下
1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;
2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。
3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。
作者: 白建新    时间: 2012-4-10 11:08
1、   如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法

(new),而不能覆盖(override)。

2、如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏(new)。

3、如果子类实现了父类相同的方法(相同的方法名称及签名),而没有new,在编译时会报警,但

编译仍然能够通过!

4、调用父类方法:base.方法名()

5、abstract类是一个抽象类,不能被实例化,只能继承

6、最后讲讲重载(overload):是在同一个类中的两个或两个以上的方法,拥有相同的方法

名,函数类型也相同,但是参数却不相同,最常见的重载的例子就是类的构造函数。





实验例子如下:




1、虚方法的概念:

                         类中的方法声明前加上了virtual 修饰符,我们称之为虚方法;

                        如:  class A

                                              {

                                                    public virtual void F(){} //虚方法

                       }

                            virtual修饰符表明:该基类(本例中指A类)的派生类(本例中指B类)可以





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2