A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冉贵阳 黑马帝   /  2012-4-10 08:57  /  1963 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是类的虚方法?在具体应用中有什么作用?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

2 个回复

倒序浏览
虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类。
如:飞禽 bird = new 麻雀();那么飞禽就是申明类,麻雀是实例类。
具体的检查的流程如下
1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;
2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。
3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
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类)可以

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马