复习7--继承与派生
- 格式:docx
- 大小:12.51 KB
- 文档页数:1
第17讲教学内容7.1 类的继承与派生7.1.1继承与派生实例7.1.2 派生类的定义7.1.3派生类的生成过程7.2 访问控制7.2.1 公有继承7.2.2 私有继承7.2.3 保护继承教学重点和难点1什么叫继承?继承的作用?2派生类的声明方式3 三种继承方式下的访问控制的理解教学方法:通过举实际生活中的例子,讲解继承的概念通过程序举例演示,讲解如何产生一个派生类,以及三种继承方式下的访问控制的理解教学学时2 学时教学过程一继承概述:1什么叫继承?没有继承的话,类就只是带有相关行为的数据结构,不过继承还为编程语言增加了全新的元素。
通过继承,可以在现有类的基础上构件新类,这样,类就变成了可重用,可扩展的组件了。
现实世界中的对象一般都呈层次体系存在,也就是一种“is a”的关系。
在程序设计中,如果要在一个类之上构件另一个类,或者只是对一个了类做简单的修改来构件另一个类,就与这种关系有关。
要实现这个目的,一种途径积聚市把这个类的代码复制粘贴到另一个类,通过修改相关部分或者添加代码,就可以达到目的,创建一个与原来的类稍有不同的类。
但这种方法的缺点主要是:1)这种方法并没有建立真正的”is a”关系。
新类与原来的类相似,这只是新类共享了原来的代码,并不是因为新类与原类确实是同一个对象类型。
2)编译器并不知道两个类之间的关系,所以这两个类不是多态的----它们并非同一个事物的不同变种3)有时候并不能得到原始代码,原始代码或许只是以预编译的二进制格式存在,所以复制粘贴代码不太现实。
4)可以看到,这种复制加粘贴的方法经常容易出错误而且浪费时间,也会导致许多代码的物理拷贝残留在整个系统中,使代码维护工作困难重重。
那么,有没有一种方法,不需要复制代码,就可以“吸收”一个类的属性和行为,使其作为另外一个类的一部分?毫无疑问,C++对定义的真正的is a关系提供了内置支持。
继承关系构成了一种树状层次结构,基类和派生类之间存在着层次关系•类的继承是新的类从已有的类那里得到属性和行为,同时也可以加入新的特性。
第七章继承和派生一、基类和派生类1. 在C++中,可以从一个类派生出另一个类,前者称为基类或父类,后者称为派生类或子类。
一个派生类可以从一个或多个基类派生。
从一个基类派生的继承称单继承,从多个基类派生的继承称多继承。
2. 单继承定义格式:class 派生类:继承方式基类{ 派生类新定义成员;};其中,“派生类”是从“基类”按指定的“继承关系”派生出的、新定义的一个类的名字。
“继承方式”有三种:(1)public 公有继承(2)private 私有继承(3) protected 保护继承3. 多继承定义格式:class 派生类:继承方式1 基类1,继承方式2 基类2,…{ 派生类新定义成员;};4. 公有继承:当派生类的继承方式是public继承时,基类的public和protected成员的访问属性在派生类中保持不变,而基类的private成员不可访问,即基类的public和protected成员分别作为派生类的public和protected成员,派生类的其他成员可以直接访问它们。
例1:class B{ private: int x; protected: int y; public: int z;…};class A:public B{ private: int a; protected: int b; public: int c;…}; A a;(1)类B是基类,有3个数据成员x、y、z,分别是private、protected、public属性。
类A是派生类,有3个数据成员a、b、c,分别是private、protected、public属性。
由于类A是从类B公有派生的,类B中的public、protected属性的成员可继承到类A中来,且保持原来的属性。
故类A中有5个数据成员,即a、b、c、y。
(2)可以通过类A的对象a直接访问public成员,即z和c,并不能访问a、b、y数据成员。
C++ Inheritance继承和派生继承:一个新类从已有的类那里获得其已有特性已存在的类称为:新建立的类称为-派生:从已有的类产生一个新的子类声明派生类【继承就是继承已有特性,派生就是在继承的基础上加以修改,这样理解吧……】继承是从子类角度来讲的,是说子类从父类中继承得到某些属性…派生是从父类角度来讲的,是说父类派生出子类子类的对象同时也可以是父类的对象。
父类的公有函数继承到子类是否还是公有要看继承方式(权限约束)父类的变量(如int a;)如果子类有相同的名字(int a;),就会被子类覆盖掉,就是说子类里面只有一个int a;【还是可以调用父类的a,但是调用方式不一样.】其实是有的,调用方式要用域来标志,比如A派生出B,B里面就有两个变量a,用B::a就是自己的,用A::a就是父类的派生类不能继承:基类的析构函数、构造函数基类的赋值运算符基类的友元派生类可以增加:新的数据新的成员函数新的构造函数、析构函数新的友元C++访问控制-- private, public, protected可以被以下访问该类中的函数其友元函数PS。
该类的对象也不能直接访问可以被以下访问该类中的函数子类的函数其友元函数可以被以下访问该类中的函数子类的函数其友元函数通过该类的对象访问继承方式你要注意的就是,子类有子类自己的东西可以加进去,这个跟父类是不冲突的,是子类自己定义的,而从父类继承下来的属性服从下面的表格。
基类的私有成员不被继承公有继承不改变属性保护继承把基类的公有函数和保护函数改为保护私有继承把基类的公有函数和保护函数改为私有单继承和多继承单继承:多继承:直接继承和间接继承直接继承Employee是HourlyWorker的直接继承间接继承Employee是MinuteWorker的间接继承【就是类似祖孙是间接继承,父子是直接继承……】对…函数重写overriding:只用函数名做标志重写是替换原有函数,重载是允许存在参数表不同的同名函数fun被重写了要访问Base中的fun()要通过静态函数与非静态函数【我理解的就是作用域的不同】百度到的部分相关解释:C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。
继承和派生练习一、选择题1、关于保护继承,下列说法错误的是()。
A、保护继承的特点是基类的所有公用成员和保护成员都成为派生类的保护成员。
B、派生类对象不能访问基类中的任何成员。
C、派生类的对象可以访问基类的公有成员。
D、保护继承的派生类和私有继承的派生类,对基类成员访问属性是相同的。
2、关于私有继承,下列说法错误的是()。
A、基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接访问他们。
B、基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员不能直接访问他们。
C、基类的私有成员,派生类的成员和派生类的对象都无法访问。
D、派生类的对象无法访问基类的所有成员。
3、在公有继承中,基类中的保护成员作为派生类的()。
A、公有成员B、私有成员C、保护成员D、私有成员函数4、基类()在派生类中的性质和继承的性质一样。
A、公有成员B、私有成员C、保护成员D、私有成员函数5、派生类的对象对它的基类成员中的()是可以访问的。
A、公有继承的公有成员B、公有继承的私有成员C、公有继承的保护成员D、私有继承的私有成员6、C++类体系中,不能被派生类继承的有()。
A、构造函数B、虚函数C、静态成员函数D、赋值操作函数7、下列说法错误的是()。
A、公有继承的基类中的public成员在派生类中仍是public的B、公有继承的基类中的private成员在派生类中仍是private的C、私有继承的基类中的public成员在派生类中变成private的D、保护继承的基类中的public成员在派生类中变成protected的8、下列对继承的描述中,错误的是()。
A、析构函数不能被继承B、派生类也是基类的组合C、派生类的成员除了它自己的成员外,还包含了它的基类的成员D、派生类中继承的基类成员的访问权限到派生类保持不变9、下列对基类和派生类关系的描述中,错误的是()。
A、派生类是基类的具体化B、派生类是基类的子集C、派生类是基类定义的延续D、派生类是基类的组合10、C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
复习题7
1.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。
对两个有相同名字的数据成员进行访问时,如果没有作用域分隔符限定,对此数据成员的访问将出现歧义。
2.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。
对两个有相同名字的数据成员进行访问时,如果没有作用域分隔符限定,对此数据成员的访问将出现歧义。
3.类的继承是指子类继承基类的___数据成员_____和成员函数。
4.在保护派生中,基类权限为Private的成员在派生类中_不能直接访问___。
5. this指针存在的目的是( B)
A.保证基类公有成员在子类中可以被访问
B.保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码
C.保证基类保护成员在子类中可以被访问
D.保证基类私有成员在子类中可以被访问
6.在哪种派生方式中,派生类可以访问基类中的protected成员( B)
A.public和private B.public和protected
C.protected和private D.仅protected
7. 第7章习题:1;2;4;8。