当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第6章 MFC基础知识 > 6-2 C++的基本知识 > 6-2-11 多态性和虚拟函数
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
简单地说
多态性就是一种实现
一个接口多种方法
的一种技术
是面向对象程序设计的重要特性
我们可以利用多态性
在基类和派生类中使用同样的函数名而定义不同的操作
从而实现一个接口多个方法
这是一种在运行时出现的多态性
它通过派生类和虚拟函数来实现
虚拟函数是在基类中的成员函数前加上virtual
然后在派生类中再加以定义的函数
我们调用重载函数时
编译系统对函数原型进行比较
以决定调用哪一个函数
但是当指针既指向派生类又指向基类时
就会产生潜在的二义性问题
例如下面的程序就会产生二义性问题
大家跟我一起看一下
定义了一个Base1这个类
然后它的成员里面有protected成员m_B1
在public里头定义了SetMember
SetMember里面有一个整型的参数
它的作用就是把传过来的x值赋给变量m_B1
SetMember就是定义基类Base1的公共成员函数
定义了Base2这个类
同样定义了基于Base2的保护数据成员m_B2
然后在public里面定义了SetMember
就是把传过来的x值赋给m_B2
我们定义了一个Base1 class
Base2类
紧接着我们定义了一个MultiDerived这个类
派生自基类Base1跟Base2
public这地方定义了GetB1和B2
在这里面将变量m_B1和m_B2的加和的值赋给了Result
输出Result这个值
前面定义了class Base1
和class MultiDerived
我们再一起看一下main函数
main函数里面定义了MultiDerived这个派生类的对象M
调用了继承自基类Base1的成员函数Setm_B1
调用继承自基类Base2的Setmember
然后再调用GetB1B2
这个时候编译
将产生访问不明确的警告错误
例如
下面的程序中通过使用虚拟函数来解决基类、派生类中
同名函数的调用引起的二义性
这里定义了一个Base这个类
定义了一个虚拟的函数
它的函数名就叫做VirtualFunc
它的操作就是输出这个字符串
class Deived派生类
在它的public里面
定义了虚拟函数VirtualFunc
输出Here is Deived
主函数里面这里定义了指向基类的指针
这是基类的对象
然后定义了派生类的对象
Deived这是派生类的对象
这时候我们把BaseObject地址赋给这个BasePtr这个指针
使得指针BasePtr指向基类对象BaseObject
然后我们调用基类中定义的虚拟函数
因为这个BasePtr已经指向了这个基类
这个时候指向的虚拟函数就是基类中的虚拟函数
我们再把DeivedObject这个对象的地址取出
赋给这个指针
这时候我再用这个指针去指向这个虚拟函数
它就是指向派生类中的VirtualFunc
运行到这句的时候它输出的是Here is Base
当运行到这个的时候它输出的是Here is Deived
通过定义成指向基类的指针BasePtr
来调用基类和派生类各自的函数VirtualFunc
所以基类和派生类中这两个函数虽然名字是一样的
但通过我们指针的处理
就可以指向我们所需要的函数
这样就解决了二义性问题
运行结果可以看出
BasePtr指针所指向的对象不同
所调用的程序也不同
也就是说
如果改变指针BasePtr所指向的对象
可以用一个指针变量调用不同的函数
从而实现“一个接口,多种方法”
这就是多态
在上面的程序中
如果我们去掉vitual这个关键词
上面的程序运行结果就变成这样了
大家可以去试一下
程序在基类中定义了虚拟函数VirtualFunc
在派生类中也定义了函数VirtualFunc
该函数在两个类中重载
虚拟函数的重载和普通函数的重载是有区别的
从上面的程序中可以看出
当发送指向一个对象的指针的消息时
使用了形如对象箭头消息这个记号
那如果没有这个virtual这关键字
那么系统在编译时采用早期绑定
它根据该指针对象的类型确定与这个消息有关的对象
那多态跟虚拟我们就简单介绍到这儿
-讨论实录
--0-0
-6-1 MFC概述
-6-2 C++的基本知识
--6-2-1 类
--6-2-2 对象
--6-2-6 重载
--6-2-9 指针
-6-3 MFC类的组织结构及主要的类的简介
--6-3-2 根类
-6-4 MFC中全局函数和全局变量
-7-1 概述
--7-1-1
--7-1-2
-7-2 按钮控件及其应用
--128B12447816EEF99C33DC5901307461
-7-3 按钮控件及其应用
--7-3
-7-4 静态控件
--7-4
-7-5 列表框控件
--7-5-1
--7-5-2
-7-6 编辑框控件
--7-6
-7-7 组合框控件
--7-7
-7-8 对话框通用控件
--7-8-1
--7-8-2
-讲义源代码
--html
-8-1&2 资源的应用以及菜单资源的使用
--8-1-1
--8-1-2
-8-3 快捷菜单的创建及其应用
--8-3
-8-4 加速键资源的创建及其使用
--8-4
-8-5 工具条资源的创建及其使用
--8-5
-8-6 字符串资源的使用
--8-6
-8-7 位图资源的创建及其使用
--8-7
-课堂示例源代码
--html
-第一次作业内容及要求
--html
--第一次作业及答题链接--作业
-9-1 概述
--9-1
-9-2 Doc/View框架的主要成员
--Video
-9-3 文档操作中的一些重要概念
--Video
-9-4 SDI编程实例
--Video
-9-5 MDI编程实例
--9-5-1
--9-5-2
-课堂示例源代码
--html
-第二次作业内容及要求
--html
--第二次作业及答题链接--作业
-10-1 利用音频函数实现多媒体程序设计
--10-1-1
--10-1-2
--10-1-3
--10-1-4
-10-2 利用Windows Media Player控件实现多媒体程序设计
--10-2
-课堂示例源代码
--html
-例11-1
--例1
-例11-2
--例11-2
-例11-3
--例11-3
-例11-4
--例11-4
-11-1 ODBC介绍与引用
--11-1
-课堂示例源代码
--html
-第三次作业及答题链接