虚函数定义的基类指针既然要指向对象的地址,那虚函数还有什么用,直接调用对象的函数就好了

如题所述

虚函数的作用是实现多态,在学习阶段是很难体会其优势和必要性的。这个需要你经过多年实战编程后,你才会觉得其重要性。

虚函数如何实现我就不多说了,但是你考虑下以下情形:

开始你接到一个任务,开发一个数据库应用系统,起初由于业务不大,使用access就可以完全够用了,所以你在项目中定义了一个access的数据库访问类,或叫数据适配器(简称DA,下同)。项目中所有访问数据库的业务代码都是按access的规范传递的参数。

后来公司规模发展,你发现access这种本地化的数据库不够用了,无论是性能还是容量。你决定采用更专业的数据库系统作为数据存储,比如SQLSERVER。这时候你会意识到需要重新定义DA,然后你会发现所有访问DA的代码都要改写(重构)。对于一个有一定规模的项目来说,是非常麻烦的事情,甚至可能会将项目推翻重新开发。这时你会意识到,如果当初规划项目时,业务代码(实现用户功能的代码)可以不涉及具体的类的访问,业务代码只按照某种规范去访问(接口),而不用区分哪种类型数据库的DA,只要业务需求没变,那不就可以在遇到数据库更替的时候不用对业务代码重构了吗?如何实现?

那么虚函数的作用就体现出来了。假设我们一开始就按多态模式规划项目,让所有业务逻辑操作DA的代码不涉及特定数据库类型,那么我们定义一个DA的虚基类(其实就是接口),定义了所有需要的函数,但不实现具体功能(虚函数),然后定义一个ACCESS的数据库的DA类名字叫ADA,让ADA继承DA,ADA按照DA定义的标准接口实现所有函数功能,业务代码通过DA指针去访问ADA对象,那么如果遇到数据库更换时,我们只要重新开发一个SQLDA的类,同样继承DA,实现所有特定功能,将对象传递给业务代码,这样业务代码不需要重写了。

多态(按现在流行的说法叫工厂模式)的好处,隔离业务逻辑,让程序员面相业务开发,而不是在开发业务逻辑时还要考虑使用了什么数据库,替换数据库时还要去重构业务代码。可以说好处大大的。

详细信息请百度~~~~~~
请记住大白话:所有开发思想都是为了帮助程序员偷懒,提高开发效率,降低维护成本,而且程序员很贪婪,有了结构,有了函数不够,索性把结构和函数结合起来成了类,有了类还要虚类......接口.....工厂模式.......没完没了.........
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-13
虚函数能够帮助实现多态。例如:
一些图形类Point Line Circle,他们派生自基类Graphic,基类有虚函数Print用于在屏幕上输出,由于每个类的输出方式是不一样的,所以每个类都对Print函数进行了各自的定义。
现在一个画图软件,程序中需要有个容器(如数组)存储各种图形,这个容器中有Point Line 等的各种对象。现在需要遍历这个容器把图形全部输出到屏幕上,由于Graphic实现了虚函数Print,就可以定义一个Graphic指针,依次指向每个对象并调用Print函数,每个对象就能自动按照自己的类型正确Print。若没有虚函数功能,Graphic指针就必须依次判断这个对象是什么类型,再手动调用相应的Print函数,代码会变得很长
第2个回答  2014-04-13
其实虚函数是实现c++语言多态的方式,当你有多个类时,你就可以定义虚函数通过基类指针来指定你要调用的那个类的这个同名函数,你如果直接用调用对象的函数也可以,那你每次都要声明一个该类的对象,所占空间比较大
第3个回答  2014-04-13
虚函数实现了多态,当你的父类和子类中都有一个相同名称但是内部实现不一样的函数时,怎样知道哪个函数被调用了呢(父类的成员还是子类的成员)?
如这样一个函数
printfunc(parent * p)
{
p->print();

}
如果我传的是子类的指针那他也会调用父类的成员而不是子类的(这是由编译器的特性决定的C++是静态编译型语言),但是如果我把父类和子类中的同名(应该说名字参数都一样)成员定义为虚函数,那么我传给printfunc谁的指针它就会调用谁的成员。
相似回答
大家正在搜