当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 >  第6章 MFC基础知识 >  6-2 C++的基本知识 >  6-2-11 多态性和虚拟函数

返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表

6-2-11 多态性和虚拟函数在线视频

6-2-11 多态性和虚拟函数

下一节:6-3-1 MFC类的组织结构

返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表

6-2-11 多态性和虚拟函数课程教案、知识点、字幕

简单地说

多态性就是一种实现

一个接口多种方法

的一种技术

是面向对象程序设计的重要特性

我们可以利用多态性

在基类和派生类中使用同样的函数名而定义不同的操作

从而实现一个接口多个方法

这是一种在运行时出现的多态性

它通过派生类和虚拟函数来实现

虚拟函数是在基类中的成员函数前加上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这关键字

那么系统在编译时采用早期绑定

它根据该指针对象的类型确定与这个消息有关的对象

那多态跟虚拟我们就简单介绍到这儿

VC++面向对象与可视化程序设计(下):MFC编程基础课程列表:

第0章 课前讨论

-讨论实录

--0-0

第6章 MFC基础知识

-6-1 MFC概述

--6-1 MFC基础知识

-6-2 C++的基本知识

--6-2-1 类

--6-2-2 对象

--6-2-3 类的方法

--6-2-4 内联函数

--6-2-5 构造函数和析构函数

--6-2-6 重载

--6-2-7 友元函数

--6-2-8 友元类

--6-2-9 指针

--6-2-10 类的继承

--6-2-11 多态性和虚拟函数

-6-3 MFC类的组织结构及主要的类的简介

--6-3-1 MFC类的组织结构

--6-3-2 根类

--6-3-3 应用程序结构类

--6-3-4 可视对象类

--6-3-5 通用类

--6-3-6 OLE类

--6-3-7 ODBC数据库

-6-4 MFC中全局函数和全局变量

--6-4 MFC中全局函数和全局变量

第7章 Windows标准控件在可视化编程中的应用

-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章 在MFC中创建应用程序的资源

-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章 单文档与多文档

-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章 多媒体应用程序的设计

-10-1 利用音频函数实现多媒体程序设计

--10-1-1

--10-1-2

--10-1-3

--10-1-4

-10-2 利用Windows Media Player控件实现多媒体程序设计

--10-2

-课堂示例源代码

--html

第11章

-例11-1

--例1

-例11-2

--例11-2

-例11-3

--例11-3

-例11-4

--例11-4

-11-1 ODBC介绍与引用

--11-1

-课堂示例源代码

--html

第三次作业及答题链接

-第三次作业及答题链接

6-2-11 多态性和虚拟函数笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。