VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 4772|回复: 100

《实用C++》第42课 多态性与虚函数

  [复制链接]
51_avatar_middle
online_admins 发表于 2018-5-22 00:21:06 | 显示全部楼层 |阅读模式
1、多态性介绍:
关于C++中面向对象的多态特性,这里面先给大家介绍一下。什么是多态性?多态,即多种形态。在C++中一般是这么解释的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。
之前其实已经给大家有使用过了,就是成员函数的重载,或者运算符的重载等等,都算是多态性的一种体现。
举个现实中的例子,我们还拿学生来做举例:说上课了,那么不同的学生可能会走进不同的教室,上课了,有的学生上语文课,有的学生上数学课,等等。所以针对同一个上课的消息,不同的学生产生的行为是不一样的。大家明白了吗?

2、使用虚函数实现多态:
这里面给大家介绍一个新的概念,虚函数。虚函数这个东西可以说是C++面向对象的一个非常重要的概念。他的核心思想就是一句话:使用基类之指针,指向派生类的对象,调用虚函数的时候,最后调用的是派生类的函数!
接下来给大家演示一下如何玩转这个虚函数:
①、分别给 CStudent、CXiaoStudent、CZhongStudent 三个类添加 shangke() 这么个成员函数;
②、分别在三个类的 shangke 函数中打印出不同的文本内容,以示区别;
③、测试如下代码:
  1. int main(int argc, char* argv[])
  2. {
  3.     CZhongStudent stud_zhong;
  4.     stud_zhong.shangke();

  5.     CStudent *pStud = &stud_zhong;
  6.     pStud->shangke();
  7.     return 0;
  8. }
复制代码


跟大家猜想的结果一致吗?
stud_zhong.shangke(); 打印的结果是 CZhongStudent::shangke 函数,pStud->shangke(); 打印的结果是 CStudent::shangke 的结果。因为我虽然用的是基类的指针 pStud 指向了派生类的对象,但是本身基类也有同名该函数,所以就调用了跟指针同类型的基类的 CStudent::shangke 的函数了;
④、这里面我改写一下,把 CStudent 的 shangke 函数声明成 virtual 虚函数,如下:
virtual void shangke()
{
    cout << "CStudent::shangke called." << endl;
}

之后我们其他不动,再来看看代码的执行结果?大家看到了吗?结果不一样了吧?两次调用的都是 CZhongStudent::shangke 函数。这就是 virtual 虚函数的妙用!
具体课程演示见视频教程!

3、虚函数的注意事项:
①、virtual 只能用来声明类的成员函数,把它作为虚函数,而不能将类作用域外的普通函数声明成虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。显然,他只能用于类的继承层次结构中;
②、一个类中的某个函数被声明成虚函数之后,同一类中就不能再定义一个非virtual的参数和返回值类型都相同的成员函数了。

4、什么情况下使用虚函数:
一般情况下是某个函数所在的类可能会作为父类/基类,而且该函数有可能会被派生类重写,并被派生类使用,那么这个时候就可以考虑将该函数声明为 virtual 虚函数。否则就不用!因为声明成虚函数之后是有开销的,所以不要随随便便的想声明成虚函数就声明。

5、小作业:
创建一个狗的类 CDog,包含 wangwang 这个虚函数,之后从 CDog 分别派生2-3个子类,比如:有金毛、吉娃娃、藏獒 等。分别实现每个子类的 wangwang 方法,之后试着调用该方法,充分理解虚函数的特性!


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=44
MP4高清视频下载地址:链接:https://pan.baidu.com/s/19zE10adCI_Fsnsdr7mZiNQ 提取码:tcw5
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用C++》第41课 父类对象与子类对象之间的相互转换
下一篇:《实用C++》第43课 文件IO操作之打开与关闭
78_avatar_middle
在线会员 发表于 2018-5-22 08:31:44 | 显示全部楼层
感谢楼主更新
98_avatar_middle
在线会员 发表于 2018-5-22 08:50:31 | 显示全部楼层
谢谢
继续跟进
62_avatar_middle
在线会员 发表于 2018-5-22 09:37:51 | 显示全部楼层
这个更新速度,真实牛《实用C++》第42课 多态性与虚函数
74_avatar_middle
在线会员 发表于 2018-5-22 20:08:14 | 显示全部楼层
看看            
80_avatar_middle
在线会员 发表于 2018-5-23 00:07:46 | 显示全部楼层
坚持学习!
79_avatar_middle
在线会员 发表于 2018-5-23 14:38:41 | 显示全部楼层
支持支持支持支持支持支持
95_avatar_middle
在线会员 发表于 2018-5-25 00:09:01 | 显示全部楼层
感谢楼主更新
85_avatar_middle
在线会员 发表于 2018-5-28 08:38:25 | 显示全部楼层
感谢分享,学习一下。
18_avatar_middle
online_vip 发表于 2018-5-28 22:01:37 | 显示全部楼层
学习一下,感谢分享
44_avatar_middle
在线会员 发表于 2018-5-29 09:22:34 | 显示全部楼层
多谢楼主费心录制.
55_avatar_middle
在线会员 发表于 2018-5-29 11:38:15 | 显示全部楼层
学习学习。。。。。
43_avatar_middle
在线会员 发表于 2018-5-29 16:01:15 | 显示全部楼层
非常喜欢,谢谢
96_avatar_middle
在线会员 发表于 2018-5-29 20:38:52 | 显示全部楼层
坚持学习~~~
45_avatar_middle
online_vip 发表于 2018-5-30 10:00:54 | 显示全部楼层
谢谢分享 谢谢分享
06_avatar_middle
online_vip 发表于 2018-5-30 15:18:57 | 显示全部楼层
我爱学习 学习爱我
82_avatar_middle
在线会员 发表于 2018-5-31 07:47:24 | 显示全部楼层
强啊。。又出新课
58_avatar_middle
在线会员 发表于 2018-5-31 19:33:26 | 显示全部楼层
谢谢分享!
87_avatar_middle
在线会员 发表于 2018-6-1 07:48:25 | 显示全部楼层
这个更新速度,真实牛
75_avatar_middle
在线会员 发表于 2018-6-1 19:14:28 | 显示全部楼层
楼主好人,感谢分享!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-23 15:41

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表