当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第6章 MFC基础知识 > 6-2 C++的基本知识 > 6-2-10 类的继承
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
类的继承
类是C++中进行数据封装的逻辑单位
C++还提供了一种继承机制
利用这种机制
用户可以通过增加、修改或替换
给定类中的方法来对这个类进行扩充
以适应不同的应用要求
利用继承机制
程序员可以在已有类的基础上构造新类
这一性质使得类支持分类的概念
如果不使用分类
则对每一个对象都定义其所有的属性
使用分类后
可以只定义某个对象的特殊属性
每一层的对象只需定义属于它本身的属性
其他属性可以从上一层继承下来
派生类
派生类也称子类
是C++提供继承的基础
也是对原来的类进行扩充和利用的一种基本手段
C++派生类继承或修改原有类中的部分或全部方法
而且可以增加原来类中没有的新方法
以满足使用派生类的需要
一个类可以继承另一个类的属性
其中被继承的类叫做基类
继承后的产生的类叫做派生类
基类也成为父类
派生类也称为子类
派生类从基类中继承所有的公共部分
请大家注意这个公共部分
并可以增加数据成员和成员函数
这使程序员可以根据基类与派生类的差异
来建立特定对象的新类
对相同部分的代码不必重新定义
此外还可以为多个不同的类提供公用界面
使程序设计人员更容易表达类型间的关系
从而减少程序设计的工作量
任何类都可以作为基类
一个基类可以有一个或多个派生类
一个派生类还可以成为另一个类的基类
定义派生类的一般格式如下
关键字class这是少不了的
然后是派生类的名字
访问属性
基类名
这里就是里面该定义的成员
其中派生类名是新定义的类的名
访问属性是访问说明符
可以是private、public跟protected三者之一
缺省值是private
派生类的名和访问属性之间这时候请大家注意
用的是冒号单冒号隔开
前面介绍的一个类下面成员函数的定义
这时候分割是用双冒号
派生类的访问属性由访问控制来确定
它是按下述的方式来继承基类的访问属性
如果访问属性是public
访问控制有这么几点
基类的public成员是派生类的public成员
基类的private成员是不可访问的
除非基类中声明的友元函数授权访问
基类的protected成员对基类仍保持protected属性
这是针对访问属性为public的
如果访问属性是protected
基类的public跟protected成员
均是派生类的protected成员
除非基类中声明的友元函数授权访问
基类中声明为protected的数据只能被基类的成员函数
或其派生类的成员函数访问
不能被派生类以外的成员函数访问
如果访问属性定义为private
那基类的public跟protected成员都是派生类的private成员
基类的private成员是不可访问的
除非基类中声明的友元函数授权访问
那也就是说
这里定义了访问属性跟访问控制这个地方
也就是说针对不同的属性
对访问是有相应的控制的
那访问属性及其控制
大家要逐步地熟悉起来
基类名可以有一个
也可以有多个
如果只有一个基类
则这种继承方式叫做简单继承
如果基类名有多个
则这种方式的继承叫做多重继承
基类之间用逗号隔开
理论上说
子类继承了基类的所有成员
除了如下情况
第一构造函数constructor
和析构函数destructor
第二操作符重载符号operator等于某个成员
第三个是友元friends
多重继承就要比简单继承要复杂了
在C++中
一个class可以从多个class中继承属性或函数
只要在子类的声明中用逗号将不同基类分开就可以了
多重继承的格式与简单继承的格式基本相同
不一样的是
这里基类的话是一个基类名表
因为它从多个基类中继承下来
而前面介绍的简单继承
它这里就是一个基类名
不是一个基类名表
既然这里是基类名表
说明这里是多个基类
基类名表是两个或两个以上的基类名
各基类名之间用逗号隔开
在每个基类名之前都要指明访问属性
缺省的访问属性都是private
下面的程序定义的类MultiDerived继承基类Base1和Base2
它是实现多重继承的一个很好的例子
请大家看一下
这里定义了class1
protected是m_B1
定义了public Setm_B1
是把这里接收的值赋给m_B1
实际上就是给它初始化
我们又定义了Base2这个类
它的protected成员是m_B2
public成员是Setm_B2
也是把接收的x值对m_B2初始化
然后我们定义了MultiDerived
那这个就是我们的派生类
访问属性
public的Base1
跟public的Base2
从这里面派生出来了
它的公共成员这里就是定义了一个函数GetB1B2
定义了一个Result
Result的结果
m_B1跟m_B2的相加
因为它这个类是从public Base1跟public Base2中继承下来的
所以在这个里面是可以访问Base1跟Base2类里面的参数
所以在这里面可以直接把这两个数加起来
因为它可以访问
加起来后输出这结果
主函数定义了一个变量
这变量是MultiDerived类的对象
实际上就是把15的值赋给m_B1
通过调用Setm_B2把35的值赋给Base2的protected成员m_B2
调用GetB1B2
在这里它是把m_B1跟m_B2的值加和保存到Result里面
这个是原样打印的
就没问题了
然后就输出Result
显然Result输出的值就是15跟35的加和
所以这个结果应该是50
从这里我们就可以看到
M.Setm_B1实际上就是调用继承自基类Base1的成员函数
同样这个是调用继承自基类Base2的成员函数
而这个函数调用是调用派生类中自定义的成员函数
我们把程序运行一下
大家看到这就是运行结果
它的值就是50
这个结果跟我们代码分析的结果是一致的
上面的程序中
类MultiDerived继承自基类Base1跟Base2
继承了两个类的成员
可以访问基类Base1和Base2中定义为protected和public的成员
在主函数中
定义了类MultiDerived的对象M
然后分别调用Base1和Base2中的成员
完成初始化、计算和输出操作
多重继承在给程序设计带来极大方便的同时
也给程序带来了以下负面的问题
如果从类库的组织的角度看
多重继承必然会增加类库结构的复杂性
从而为程序的稳定性留下隐患
从程序设计的角度看
其负面影响就是容易带来二义性
如果基类的多个基类中都同时定义了同名的成员
则编译器将不能准确地理解程序员的意图
从而导致错误
因此使用多重继承要谨慎
-讨论实录
--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
-第三次作业及答题链接