c++多态和虚函数(面向对象程序设计)-lesson14


前言

之前的内容是面向对象-基于对象的程序设计,现在开始面向对象-面向对象的程序设计,首先是面向对象的另一个主要特点:多态。


一、多态性的概念

多态性是面向对象-面向对象的程序设计的另一个特征,有些语言由于支持类的继承,但是不支持多态,如visual basic等语言,只能算是基于对象的编程,不算面向对象编程。

面向对象对多态是这样描述的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息,其中消息就是调用函数,不同的行为就是不同的实现,即执行不同的函数。

多态现象:
①静态多态(编译时的多态性):函数的重载、运算符的重载(也是函数的重载)
②动态多态(运行时的多态性):虚函数和指向基类的指针变量

多态性是“一个接口,多个方法”----这句话最后看完再理解。

二、预备知识、思考、目的和使用方法

1.预备知识(前面讲过)

①函数的重载(首部不同:参数的格式或者类型不同)
②函数的隐藏(继承层次中,名字相同、参数的相同的函数):a.display()以及a.B::display()
③虚函数的覆盖(重写):直接讲派生类中基类的那个函数替换了

2.思考

对于继承层次中的函数,想要输出同一类族(一个基类生出来多个派生类,派生类又生出来派生类)同一个函数,有以下两种 方法:
①每个类定义一个对象:对象.成员函数
②每个类定义有一个指针:指针->成员函数

结合以上:人们提出来,能否通过同一条语句,或者叫同一种调用形式“pt->display”调用同一类族中不同派生层次中的dispaly函数,这其实是从前面所说的基类和派生类转换过度过来的。

这里我们要讲的是虚函数:
虚函数表剖析

3.目的

我们要继承,但是对于基类中有些方法又有差异性,所以要重写基类中的方法,有两种方式:上面所讲1中的②和③,其实我们更多的是用③,②留着没有什么意义。

4.使用方法

①在类中声明virtual成员函数,类外定义是不用加virtual;
②派生类中重新定义这个成员函数,所有的都要相同;派生类中的成员函数也变成virtual(其实是继承了虚函数表),不管有没有向①中一样声明virtual;
定义一个基类的指针,使他指向类族中不同的对象,并调用同名的虚函数,就指向了对象中自己的同名函数。

三、注意事项和虚析构函数

1.注意事项

①虚函数只能是类的成员函数,不能是普通函数;同时类中不能在定义一个一模一样的非虚函数;
②如果基类中的函数有可能被派生类所改写,则应该声明为虚函数;如果派生类不用修改或者压根就用不到,不考虑虚函数;
③看是通过对象名还是指针或者引用去调用该函数,如果是基类指针,则用虚函数,这是废话!!!
④有的时候只声明虚函数,不定义它或者定义它的函数体是空的,只是在虚函数表中占一个位置,这一类就纯虚函数。

2.虚析构函数

专业的高手都喜欢用,但是我没搞明白????构造函数不能是虚构的???这个我也没有搞明白???

四、纯虚函数、抽象类和小结

1.纯虚函数

//返回值为0的虚函数
virtual float area() const
{
	return 0}

//上面的函数基本上没有意义
//声明纯虚函数,注意这个地方的const不是必须的
virtual float area() const = 0;

格式:virtual 函数类型 函数名(参数表列) = 0

注意以下几点:
①纯虚函数没有函数体;
②最后面的=0并不是函数的返回值是0的意思,它只是告诉编译系统这是纯虚函数,在虚函数表中占个位置;
③这是一个声明语句,不是定义,要带分号;
④如果派生类中对他没有定义,那他还是一个纯虚函数,否则就是个虚函数,不知道这个对不对????

2.抽象类

我们都知道,声明一个类就是为了定义对象,但是有些类是无法定义对象的,就是这里的抽象类,因为纯虚函数不能被调用,所以含有纯虚函数的类焦作抽象类,声明他们的目的是用它做基类,所以又叫抽象基类,生成派生类,由派生类去定义对象,然后基类指针和虚函数,实现多态。

他的目的作为一个类族的公共基类,或者说是为一个类中提供公共的接口。

注意事项:
①如果派生类没有完全实现纯虚函数,则这个派生类还是抽象类,不能定义对象;如果全部实现,就是具体类了,可以定义对象;
②现实中,一个类的层次中可以不包含抽象类,也可以是有几层包含抽象类;
③目的是用它来实现多态。

3.小结

①一个基类中有一个或者多个函数是纯虚函数,这个就是虚基类;
②抽象基类和普通基类不同,他可以是没有任何物理意义,可以没有数据成员,至少有一个纯虚函数;
③抽象基类是接口,使用基类指针指向类族中的对象,实现多态;
④静态关联:通过对象名调用虚函数;动态关联:通过基类指针调用虚函数;
⑤如果基类中声明了虚函数,则派生类中凡是一模一样(函数名、函数参数、参数类型和个数、返回值?)均为虚函数,无论派生类中是否virtual声明;
⑥纯虚函数是在抽象类中声明的,只是在抽象基类中才称为纯虚函数,在派生类中虽然继承了该函数,除非再次用”=0“把他声明为纯虚函数,否则不能称为纯虚函数,只要实现了,就变成了虚函数。
–这两个需要好好想想,写个程序试一下

⑦多态的好处:
1)基类和派生类让类的设计厂商去实现,我们看统一的接口,在外面进行多态调用,不必关心细节,只需要统筹应即可;
2)在main函数中只要修改基类指针指向的对象即可。


总结

这一节的内容有点多,重点和难点是继承和多态,多多练习。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值