C++ Course Material3
C++面向对象程序设计第4章
第4章 派生类与继承
类的封装性类A 私有成员 一般为: 数据成员
对象1
外部函数
void main() { 类A 对象1; a=10 对象1.a X 错!不能访问私有成员 对象1.g(5)√ g(int n) { …… } } 外部函数 int f(类A 对象2) { ……(同样)
a公有成员 一般为: 成员函数 g(int n)
对象2
}
4.1 派生类的概念4.1.1 为什么要使用继承 从现有类出发建立新的类,使新类继承老类的特点和功能,并 且又加上自己的特点和功能的程序设计方法,是面向对象程序设计 一个重要的技术。 老的类叫基类,新的类叫派生类。 继 汽 车 派 对派生类可做如下几种变化: 承 生 (1) 可以增加新的成员数据。 (2) 可以增加新的成员函数。 运输汽车 专用汽车 (3) 可以重新定义己有的成员函数。 消防车 洒水车 (4) 可以改变现有成员的属性。 客车 货车 C++中有两种继承: 单继承 单继承和多重继承。 窗 口 滚 动 条 对于单继承(单基派生) 派生类只能有一个基类; 对于多重继承(多基派生) 可滚动的窗口 派生类可以有多个基类。 多重继承
class person{ public: : void print() { cout<<”姓名:”<<name<<endl; cout<<”年龄:”<<age<<endl; cout<<”性别:”<<sex<<endl; } class Employee{ protected: public: string name; : int age; void print1() char sex; { cout<<”姓名:”<<name<<endl; }; cout<<”年龄:”<<age<<endl;
};
cout<<”性别:”<<sex<<endl; cout<<”部门:”<<department<<endl; cout<<”薪金:”<<salary<<endl; } protected: string name; int age; char sex; string department; float salary;
4.1.2 派生类的声明class person{ public: void print() { cout<<”姓名:”<<name<<endl; cout<<”年龄:”<<age<<endl; cout<<”性别:”<<sex<<endl; } protected: string name; int age; char sex; }; class Employee:public person{//声明派生类Employee公有继承了基类person public: void print1() //新增加的成员函数 { print(); cout<<”部门:”<<department<<endl; cout<<”薪金:”<<salary<<endl; } private: string department; //新增加的数据成员 float salary; //新增加的数据成员 };
声明派生类格式: class 派生类名 : [继承方式] 基类名 { //派生类新增的数据成员和成员函数 }; 继承方式: 公有继承(用public) 私有继承(用private或缺省) 保护继承(用protected)
4.1.3 派生类的构成 派生类除了可以从基类继承成员外,还可以增加自己的数据成 员和成员函数,是派生类对基类的发展。 person 类 string name; int age; char sex void print() Employee 类 string name; int age; char sex; void print() string department; float salary; void print1();
继承
新增
1) 派生类从基类接收成员 2) 调整从基类接收来的成员 3) 在派生类中增加新的成员
4.1.4 基类成员在派生类中的访问属性 由前面第3章已知: 单独一个基类,
其成员有public(公有)、 protected(保护)和 private(私有)三种被访问的属性,在基类内的自身成员可以对基 类中任何一个其他成员进行访问。但是若基类定义了对象后,通过 对象就只能访问该类的公有成员。 当定义了派生类以后,派生类继承了基类除构造函数和析构函 数以外的所有成员,但这些继承下来的成员在派生类中的被访问属 性就发生了变化,是在派生过程中由继承方式引起的。(调整了!) 由于继承方式有public(公有继承)、 protected(保护继承)和 private(私有继承)三种,不同的继承方式导致原来具有不同被访 问的属性的继承下来的成员在派生类中的被访问属性也就不同。 我们可对派生类中从基类继承下来的成员,划分成四种被访属 性: 不可直接访问的、公有(public)、保护(protected)和私有 (private)
表4.1基类成员在派生类中的访问属性基类中的成员 在公有派生类 在私有派生类 在保护派生类 中的访问属性 中的访问属性 中的访问属性 私有成员 不可直接访问 不可直接访问 不可直接访问 公有成员 公有 私有 保护
保护成员
保护
私有
保护
(1) 基类中的私有成员 无轮哪中派生方式,基类中的私有成员不允许派生类 继承,即派生类中是不可直接访问的。 (2) 基类中的公有成员 当继承方式为公有时,在派生类中仍以公有成员。 当继承方式为私有时,在派生类中都以私有成员。 当继承方式为保护时,在派生类中都以保护成员。(3) 基类中的保护成员 当继承方式为公有时,在派生类中仍以保护成员。 当继承方式为私有时,在派生类中都以私有成员。 当继承方式为保护时,在派生类中都以保护成员。
class base private:
protected:public: 私有继承 保护继承 公有继承
class derive1 新private:新protected: 新public:
class derive1 新private: 新protected: 新public:
class derive1 新private: 新protected: 新public:
4.1.5 派生类对基类成员的访问规则 派生类对基类成员的访问形式 (1) 内部访问。即由派生类中新增成员对基类继承来的成员访问。 (2) 对象访问。即在外部,用派生类的对象对从基类继承来的成员 访问。 1.私有继承的访问规则: 当类的继承方式为私有继承时,基类的public成员和protected成 员被继承后作为派生类的private成员,派生类的其他成员可以直接 访问它们,但是在类外部通过派生类的对象无法访问。 基类的private成员不允许派生类继承,因此在私有派生类中是 不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都 无法直接访问从基类继承来的private成员,但是可以通过基类提供 的public成员函数间接访问。 表4.2 私有继承的访问规则基类中的成员 访问方式 内部
访问 对象访问 私有成员 不可访问 不可访问 公有成员 可访问 不可访问 保护成员 可访问 不可访问
例4.1 私有继承的访问规则举例1#include <iostream.h> class Base{ //定义基类 public: void setx(int n) { x=n; } void showx() { cout<<x<<endl; } private: int x; }; class Derived : private Base { //定义私有派生类 public: void setxy(int n, int m) { setx(n); y=m; } //可以用setx,它已成为该类的private void showxy() { cout <<x<<y<<endl; } // 非法不能访问 x ,改为 showx( );cout<<y<<endl; private: int y; }; void main() { Derived obj; obj.setx(10); //非法 obj.showx(); //非法 obj.setxy(20,30); //正确 obj.showxy(); //正确
上面是公有成员变成私有,下面是保护成员变成私有: 例4.2 私有继承的访问规则举例2#include <iostream.h> class Base{ //定义基类 public: void seta(int sa) { a=sa; } void showa() { cout<<"a="<<a<<endl; } protected: int a; }; class Derive1: private Base { //定义私有派生类 public: void setab(int sa, int sb) { a=sa; b=sb; } //可以用sa,它已成为该类的private void sho …… 此处隐藏:2670字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [外语考试]管理学 第13章 沟通
- [外语考试]07、中高端客户销售流程--分类、筛选讲
- [外语考试]2015-2020年中国高筋饺子粉市场发展现
- [外语考试]“十三五”重点项目-汽车燃油表生产建
- [外语考试]雅培奶粉培乐系列适用年龄及特点
- [外语考试]九三学社入社申请人调查问卷
- [外语考试]等级薪酬体系职等职级表
- [外语考试]货物买卖合同纠纷起诉状(范本一)
- [外语考试]青海省实施消防法办法
- [外语考试]公交车语音自动报站系统的设计第3稿11
- [外语考试]logistic回归模型在ROC分析中的应用
- [外语考试]2017-2021年中国隔膜泵行业发展研究与
- [外语考试]神经内科下半年专科考试及答案
- [外语考试]园林景观设计规范标准
- [外语考试]2018八年级语文下册第一单元4合欢树习
- [外语考试]分布式发电及微网运行控制技术应用
- [外语考试]三人行历史学笔记:中世纪人文主义思想
- [外语考试]2010届高考复习5年高考3年联考精品历史
- [外语考试]挖掘机驾驶员安全生产责任书
- [外语考试]某211高校MBA硕士毕业论文开题报告(范
- 用三层交换机实现大中型企业VLAN方案
- 斯格配套系种猪饲养管理
- 涂层测厚仪厂家直销
- 研究生学校排行榜
- 鄱阳湖湿地景观格局变化及其驱动力分析
- 医学基础知识试题库
- 2010山西省高考历年语文试卷精选考试技
- 脉冲宽度法测量电容
- 谈高职院校ESP教师的角色调整问题
- 低压配电网电力线载波通信相关技术研究
- 余额宝和城市商业银行的转型研究
- 篮球行进间运球教案
- 气候突变的定义和检测方法
- 财经大学基坑开挖应急预案
- 高大支模架培训演示
- 一种改进的稳健自适应波束形成算法
- 2-3-鼎视通核心人员薪酬股权激励管理手
- 我国电阻焊设备和工艺的应用现状与发展
- MTK手机基本功能覆盖测试案例
- 七年级地理教学课件上册第四章第一节




