对C++中虚函数、纯虚函数在多态中作用的一点认识

原创 2002年05月14日 19:37:00
标题:对C++中虚函数、纯虚函数在多态中作用的一点认识
(原名)我对C++中虚函数、纯虚函数在实现多态中作用的一点浅薄认识

mahongxi(原作)


多态是面向对象程序设计和面向过程程序设计的主要区别之一,何谓多态?记得在CSDN里一篇论C++多态的文章里有一名话:“龙生九子,子子不同”多态就是同一个处理手段可以用来处理多种不同的情况,在钱能老师的《C++程序设计教程》书中有这样一个例子:
定义了一个小学生类
[本文全部代码均用伪码]
class Student
{public:
Student(){}
~Student(){}
void 交学费(){}
//......
};
里面有一个 “交学费”的处理函数,因为大学生和小学生一些情况类似,我们从小学生类中派生出大学生类:
class AcadStudent:public Student
{public:
AcadStudent(){}
~ AcadStudent(){}
void 交学费(){}

//.......
};

我们知道,中学生交费和大学生交费情况是不同的,所以虽然我们在大学生中继承了中学生的"交学费"操作,但我们不用,把它重载,定义大学生自己的交学费操作,这样当我们定义了一个小学生,一个大学生后:

Student A;
AcadStudent B;

A.交学费(); 即调用小学生的,B.交学费();是调用大学生的,功能是实现了,但是你要意识到,可能情况不仅这两种,可能N种如:小学生、初中生、高中生、研究生.....
它们都可以以Student[小学生类]为基类。

如果系统要求你在一群这样的学生中,随便抽出一位交纳学费,你怎么做?

:
//A为抽出来的要交学费的同学
{switch(typeof(A))
{case 小学生:A.小学生:: 交学费 ();break;
case 初中生:A.初学生:: 交学费 ();break;
case 高中生:A.高学生:: 交学费 ();break;

default:
.............
}
}

首先,我们要在每个类中定义一个 typeof()用来识别它的类型,然后还要在程序中进行区别,这样一来,虽然也行,但是,如果再增加类型则要改动switch,又走了面向过程的老路,而且想通过一个模块进行操作实现起来也有难度。
所以C++中提供了多态,即能通过迟后联编的技术实现动态的区分。
在基类的"交学费"前加个Virtual 用来告诉系统,遇到这个处理过程要等到执行时再确定到底调用哪个类的处理过程。这样一来就可以:

void 通用的交学费操作 (Student &A)
{A.交学费();
}

一下全部搞定,你再加新的类型我也不怕!!![具体的实现原理参考:《Inside The C++ Object Model》]。如果没有 virtual这一声明,那么,系统在执行前就确定了操作,比如把“大学生”传给
void 通用的交学费操作 (Student &A)
{A.交学费();
}
,则A.交学费();调用的是大学生类中继承于Student类中的“交学费操作”
所以虚函数对多态的实现是必要的。

为什么会出现纯虚函数呢?

如果按上面的例子进行编程,所有类型都继承小学生类,我们会发现一此小学生自己特定的东东[比如 void 上美术课();],也都被大学生继承来了,虽然不影响大学生的操作,但是随时间的加长,小学生类中自已所特定的东东越来越多,这样下去,大学生中冗余的数据就多了,有什么办法可以解决????

就是定义基类时定义一个抽象类,如学生类,在学生类中实现一此大家都有的操作
。这个过程就叫分解。
这个类子对纯虚函数的说明还不够明显,换个例子比如:



class 人()
{public :
//......
void 吃()
{人吃饭;
}
//......
char *Name;
int age;
};

class 狗()
{public :
//......
void 吃()
{狗吃屎;
}
//......
char *Name;
int age;
};

人类、狗类有一些相同的东东,如名字,年纪,吃的动作等,有人想到了为了代码的重用,让人类继承狗类,可是数据的冗余让这个想法完蛋了,所以有人又想出可不可以定义一个这样的类:


这个类界于人类狗类之间,有人类和狗类共有的一些东东,比如年纪,名字,体重什么的,但它是不存在实例的,它的存在意义也是只是为了派生其它类,如人类、狗类,这样可以使系统清淅、。。。。。、、反正好处多多。

在这个世界上根本不存在界于人狗之间的东东,所以这个“人狗之间类”中的“吃”也是没什么意义,你也很难为它的内容下个定义,况且也没必要,所以定义它为纯虚函数,形式为:virtual void 吃()=0; 用来告诉系统:
1、这个函数可以没有函数定义;
2、拥有本函数的类是抽象类;
你可能会说,即然纯虚函数没什么意义,为什么还要它,它的作用是什么呢?
为实现多态作准备!!!

由于抽象类的实例没意义,所以C++中不允许定义它的实例。(如果定义了这样的实例A,那么你调用A.吃()怎么办?)


当然了,你也可以在基类中,virtual 吃(){}
这样一来,基类就不是抽象类了,可以有实例,而且对于其它方面都不影响。

但你也要承认这样的对象是没有什么意识的,它的存在只能使你思考上增加负担,除错时还要考虑到是不是有这样类的对象在作怪,所以C++干脆提供了“虚函数”、抽象类,的机制,给我们操作时加了限制也可以认为是保险[不可以有抽象类的对象],试想当代码变得非常之庞大时,它的存在是多么有必要啊!!!





小弟的一点浊见,各位大侠见笑了。

可以:
MSN:mahongxi@hotmail.com大家共同讨论。

C++中对纯虚函数和多态的理解

    抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。       ⑴抽象类的定义:       称带有纯虚函数的类为抽象类。     ...
  • zhanghuaichao
  • zhanghuaichao
  • 2016年10月10日 16:11
  • 797

C++学习笔记之多态(虚函数)

多态可以分为静态的多态和动态多态,静态多态即所谓的函数重载,在编译阶段即可确定是使用哪个函数。动态多态是通过虚函数来实现的,并基于类的继承来表现。 在使用过程中应注意以下几点: 1、虚函数使用过程中,...
  • ljp1919
  • ljp1919
  • 2015年10月03日 15:16
  • 976

多态,虚函数,纯虚函数

①多态:多态可以增加其灵活性,小程序凸显不出多态的威力。 1:创建类,定义虚函数            定义:  关键字:virtual 类型 名字(){}  虚函数对于多态具有决定性的作用,有虚函数...
  • laofengge
  • laofengge
  • 2016年08月22日 14:29
  • 1805

C++虚函数和纯虚函数和抽象类

C++虚函数和纯虚函数和抽象类分析
  • x_r_su
  • x_r_su
  • 2016年08月31日 13:31
  • 743

C++的多态与虚函数

多态的作用:继承是子类使用父类的方法,而多态则是父类使用子类的方法。 在C++中,多态有两种,一种是函数重载,一种是虚函数。函数重载发生在编译的时候,它的函数参是不一样的。而虚函数是发生在运行的时候,...
  • chencheng126
  • chencheng126
  • 2015年01月06日 21:49
  • 1732

多态与虚函数,纯虚函数的概念

首先,在了解什么是多态之前,要了解什么是虚函数,虚函数对于多态具有决定性的作用,有虚函数才能构成多态。怎么样创建一个含有虚函数的类呢,其实就是函数类型前面加上关键字virtual,借助虚函数,基类指针...
  • Cineze
  • Cineze
  • 2016年08月22日 14:36
  • 703

虚函数,多态性,回调函数 简述

0. object based, object oriented. 都是用对象机制对数据进行封装,提高代码复用率,缩知问题空间与解空间之间的距离。 1. 基于对象编程语言 (Object_based...
  • lixiaoguang20
  • lixiaoguang20
  • 2017年03月13日 14:27
  • 358

C++ 虚函数、纯虚函数、继承、虚表、多态原理相关知识点总结

虚函数与纯虚函数 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中...
  • thaedi1024
  • thaedi1024
  • 2015年07月23日 14:36
  • 602

关于虚函数和多态(很好的解释)

C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
  • foreverhuylee
  • foreverhuylee
  • 2014年07月17日 12:15
  • 2161

C++与C#中的虚函数、纯虚函数、抽象类的对比

一、C++中            1、虚函数(virtual)     第一次引入虚拟函数的基类时,必须在类声明中指定virtual关键字。如果虚函数的定义放在类的外面,则不能再次指定关键字vi...
  • u010168160
  • u010168160
  • 2014年04月05日 17:48
  • 4084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对C++中虚函数、纯虚函数在多态中作用的一点认识
举报原因:
原因补充:

(最多只允许输入30个字)