c++继承与派生
国家二级C++机试(继承和派生)模拟试卷8(题后含答案及解析)
国家二级C++机试(继承和派生)模拟试卷8(题后含答案及解析) 题型有:1. 选择题选择题1.有如下类定义:class AA{ int a:public:AA(intn=0):a(n){} };class BB:public AA{ public:BB(int n)____ };其中横线处缺失部分是( )。
A.:a(n){}B.:AA(n){}C.{a(n);}D.{a=n;}正确答案:B解析:根据派生类构造函数的一般格式:<派生类名>(<总参数表>):<基类名1>(<参数表1>),…<基类名n><参数表n>),<成员对象名1>(<参数表n+1>),<成员对象名m>(<参数表n+m>)<派生类构造函数体>。
在派生类BB的构造函数总参数表后面应该接上基类名AA和其参数。
知识模块:继承和派生2.有如下程序:#inc1ude <iostream>using namespace std;class Basel{ public:Basel(int d) {cout<<d;} ~Basel( ){} };class Base2{ public:Base2(int d) {cout<<d;} ~Base2( ){} };class Derived:public Basel,Base2{ public:Derived (int a,int b,int c,int d);Basel(b),Base2(a),bl(d),b2(c) {} Private:int b1;int b2;};int main( ){ Derived d(1,2,3,4);retum 0;} 运行时的输出结果是( )。
A.1234B.2134C.12D.21正确答案:D解析:程序在创建派生类对象d时,分别调用基类Basel和Basel的构造函数。
知识模块:继承和派生3.已知基类Employee只有一个构造函数,其定义如下:Employee::Employee(int n):id(n){} Manager是Employee的派生类,则下列对Manager 的构造函数的定义中,正确的是( )。
继承与派生习题
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.关于多继承二义性的描述中,错误的是()A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。
B.解决二义性的常用方法是对成员名进行类名限定。
C.基类和派生类中同时出现的同名函数,也存在二义性问题。
D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性。
7.设置虚基类的目的是()A.简化程序B.消除二义性C.提高运行效率D.减少目标代码8.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化的次数为()A.与虚基类下面的派生类个数有关。
B.多次C.二次D.一次9.C++中的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过(),派生出新的类。
继承与派生习题
继承与派生习题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.关于多继承二义性的描述中,错误的是()A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。
B.解决二义性的常用方法是对成员名进行类名限定。
C.基类和派生类中同时出现的同名函数,也存在二义性问题。
D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性。
7.设置虚基类的目的是()A.简化程序 B.消除二义性C.提高运行效率 D.减少目标代码8.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化的次数为()A.与虚基类下面的派生类个数有关。
B.多次第 1 页共 15 页C.二次 D.一次9.C++中的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过(),派生出新的类。
C++继承与派生类习题
第九章继承与派生类9.2 典型例题分析与解答例题1:下列对派生类的描述中,(?????)是错误的。
A.??一个派生类可以作为另一个派生类的基类B.??派生类至少有一个基类C.??派生类的成员除了它自己的成员外,还包含了它的基类成员D.?派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
无论是单继承还是多继承,派生类至少有一个基类。
派生类的成员除了它自己的成员外,还包含了它的基类成员。
派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
例题2:派生类的对象对它的哪一类基类成员是可以访问的(?????)???A.公有继承的基类的公有成员???????????????B. 公有继承的基类的保护成员???C. 公有继承的基类的私有成员???????????????D. 保护继承的基类的公有成员答案:A分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。
例题3:关于多继承二义性的描述,(?????)是错误的。
A.?派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.??一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.??解决二义性最常用的方法是作用域运算符对成员进行限定D.??派生类和它的基类中出现同名函数时,将可能出现二义性答案:D分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。
C++继承与派生类习题
第九章继承与派生类9.2 典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
无论是单继承还是多继承,派生类至少有一个基类。
派生类的成员除了它自己的成员外,还包含了它的基类成员。
派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
例题2:派生类的对象对它的哪一类基类成员是可以访问的?()A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员答案:A分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。
例题3:关于多继承二义性的描述,()是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性答案:D分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。
继承与派生类答案
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
C++继承与派生类习题
第九章继承与派生类9.2 典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
无论是单继承还是多继承,派生类至少有一个基类。
派生类的成员除了它自己的成员外,还包含了它的基类成员。
派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected 成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
例题2:派生类的对象对它的哪一类基类成员是可以访问的?()A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员答案:A分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。
例题3:关于多继承二义性的描述,()是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性答案:D分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。
C++_CHAP9_史玉珍
第9章 继承与派生
构造函数
构造函数不能够被继承,因此,派生类的构造函 数必须通过跳动基类的构造函数来初始化函数子 对象,所以,在定义派生类的构造函数时,除了 对自己的数据成员进行初始化外,还必须负责调 用基类构造函数使基类的数据成员得以初始化。 如果派生类汇总还有子对象时,还应包含对子对 象初始化的构造函数。
public protected private
public protected 不可访问 public private 不可访问
protected Private 不可访问
私有继承
保护继承
第9章 继承与派生
9.2 单继承
9.2.1 9.2.2 9.2.3 9.2.4
基类成员的访问权限 构造函数和析构函数 作用域运算符:: 子类型和类型适应
void main() { B obj1; B obj2(5,6); B obj3(7,8,9); obj1.print(); obj2.print(); obj3.print(); }
第9章 继承与派生
派生类构造函数使用中应注意的问题
(1)派生类构造函数的定义中可以省略对基本结 构函数的调用,其条件是在基类中必须有缺省的 构造函数或者根本没有定义的构造函数。当然, 基类中没有定义构造函数,派生类基本不必负责 调用派生类构造函数。 (2)当基类的构造函数使用一个或多个参数时则 派生类必须定义构造函数,提供将参数传递给基类 构造函数的途径。在有的情况下,派生类构造函数 的函数体可能为空,仅起到参数传递作用。
第9章 继承与派生
9.1.2 派生类的定义格式
单继承的定义格式如下:
class <派生类名>:<继承方式><基类名
C++程序设计04737 第5章 类的继承与派生
5.1 类的继承与类的派生
5.1.2 派生类的定义与大小
2.类的大小
1. //[程序5-2]基类与子类占用空间及字节对齐
2. #include <iostream>
3. using namespace std;
4. class BaseClass //基类
5. {
6.
int v1, v2;
7.
派生类中包含了基类的成员变量,且基类
成员变量在前,派生类成员变量在后。基 类占用了12个字节,在此之后要分配派生 类自身的成员变量,一个int型变量和一个 指针变量。在64位系统中,指针占8个字 节。所以派生类的大小=12+4+8=24字节。 32位系统中指针的大小是4字节。
5.1 类的继承与类的派生
5.1 类的继承与类的派生
5.1.3 继承关系的特殊性
//[程序5-3]派生类继承了友元函数
#include <iostream>
using namespace std;
class another;//前向引用声明
class Base//基类
{private: float x;
public: void print(const another &K);};
d.print(ano);//输出: Base: 100
return 0;
}
如果派生类Derived中重写了print(),若还想在函数中访问another的私有成员,则必须将类Derived的print()函数也
声明为another的友元。在类another中需要添加如下声明:
friend void Derived::print(const another &K);//派生类的成员函数声明为本类的友元
C++语言程序设计(第3版)清华大学教程c++7
C++语言程序设计
清华大学 郑莉
类 成 员 的 访 问 控 制
保护继承(protected) 保护继承
基类的public和protected成员都以 和 基类的 成员都以 protected身份出现在派生类中,但 身份出现在派生类中 身份出现在派生类中, 基类的private成员不可直接访问。 成员不可直接访问 基类的 成员不可直接访问。 派生类中的成员函数可以直接访问基 类中的public和protected成员,但 成员, 类中的 和 成员 不能直接访问基类的private成员。 成员。 不能直接访问基类的 成员 通过派生类的对象不能直接访问基类 中的任何成员
– 派生类又作为基类,继续派生新的类。
27
C++语言程序设计
清华大学 郑莉
单 继 承 与 多 继 承
多继承时派生类的声明
class 派生类名:继承方式 基类名 , 派生类名:继承方式1 基类名1, 继承方式2 基类名2, 继承方式 基类名 ,... { 成员声明; 成员声明; } 注意:每一个“继承方式” 注意:每一个“继承方式”,只用于限制 对紧随其后之基类的继承。 对紧随其后之基类的继承。
运行结果: B0::display() B0::display() B0::display()
26
C++语言程序设计
清华大学 郑莉
单 继 承 与 多 继 承
基类与派生类的对应关系
单继承
– 派生类只从一个基类派生。
多继承
– 派生类从多个基类派生。
多重派生
– 由一个基类派生出多个不同的派生类。
多层派生
20
C++语言程序设计
C继承与派生类习题
第九章继承与派生类9.2 典型例题解析与解答例题 1:以下对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类最少有一个基类C.派生类的成员除了它自己的成员外,还包括了它的基类成员D.派生类中继承的基类成员的接见权限到派生类保持不变答案: D解析:一个派生类可以作为另一个派生类的基类。
无论是单继承还是多继承,派生类最少有一个基类。
派生类的成员除了它自己的成员外,还包括了它的基类成员。
派生类中继承的基类成员的接见权限到派生类受继承方式影响的,关于私有继承,基类的 public , protected 成员在派生类中作为 private 成员;关于公有继承,基类的public , protected 成员在派生类中接见属性不变;关于保护继承,基类的public 、 protected成员在派生类中作为protected成员。
例题 2:派生类的对象对它的哪一类基类成员是可以接见的?()A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员答案: A解析:公有继承的基类的公有成员在派生类中保持公有接见权限,因此派生类对象可以接见它;公有继承的基类的保护成员在派生类中保持保护接见权限,因此派生类对象不行以接见它;基类的私有成员不可以被派生到派生类中,因此派生类对象不可以接见它;保护继承的基类的公有成员在派生类中变为保护的接见权限,因此派生类对象不行以接见它。
例题 3:关于多继承二义性的描述,()是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员接见可能出现二义性B.一个派生类是从拥有共同的间接基类的两个基类派生来的,派生类对该公共基类的接见可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限制D.派生类和它的基类中出现同名函数时,将可能出现二义性答案: D解析:出现二义性有两种状况:调用不一样基类的同样成员时可能出现二义性;接见共同基类的成员时可能出现二义性。
第5章 类的派生与继承
第5章 类的派生与继承
class BaseClass //基类 {
int vl,v2; }; class DerivedClass : public BaseClass //派生类 {
int v3; };
第5章 类的派生与继承
二、派生类的定义与大小 1、派生类的定义 从基类派生派生类的一般格式: class派生类名:继承方式说明符 基类名 {
编程小技巧:同学们可以将鼠标放置于类中的任何一个成 员或者函数上,编程软件会提示,对应的访问权限,这个方法在 继承编程中特别好用。
第5章 类的派生与继承
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公
第5章 类的派生与继承
C++程序设计
第5章 类的派生和继承
第5章 类的派生与继承
本章内容
类的继承与类的派生 访问控制 派生类的构造函数和析构函数 类之间的关系 多层次派生 基类与派生类指针的相互转换
第5章 类的派生与继承
第一节 类的继承与类的派生
常考知识点: 继承派生基本概念 继承派生在C++中起到的作用 派生类定义的方法 派生类从基类继承的元素有哪些 继承关系中友元和静态成员变量的派生特点 单继承、多重继承的概念以及异同 派生的层次
第5章 类的派生与继承
1、继承:在一个已存在的类的基础上建立一个新的类,称 为继承
2、派生:从已有的类(父类)产生一个新的子类,称为类的 派生
3、单继承:一个派生类只从一个基类派生,这称为单继承 4、多继承:一个派生类有两个或多个基类的称为多重继承
新标准C++程序设计5. 继承和派生
5
需要继承机制的例子
而不同的学生,又有各自不同的属性和方法 研究生 导师 系 大学生 系 中学生 竞赛特长加分
6
需要继承机制的例子
➢如果为每类学生都从头编写一个类,显然会有 不少重复的代码,浪费。
7
需要继承机制的例子
➢如果为每类学生都从头编写一个类,显然会有 不少重复的代码,浪费。
class CPoint {
double x,y; };
class CCircle:public CPoint {
double r; };
31
复合关系的使用
几何形体程序中,需要写“点”类,也需要写“圆”类
class CPoint {
double x,y; };
class CCircle:public CPoint {
class CStudent { private: string name; string id; //学号 char gender; //性别,'F'代表女,'M'代表男 int age; public: void PrintInfo(); void SetInfo( const string & name_,const string & id_, int age_, char gender_ ); string GetName() { return name; }
int v3; };
13
派生类对象的内存空间
派生类对象的体积,等于基类对象的体积,再加上派 生类对象自己的成员变量的体积。在派生类对象中,包 含着基类对象,而且基类对象的存储位置位于派生类对 象新增的成员变量之前。
国家二级C++机试(继承和派生)模拟试卷5(题后含答案及解析)
国家二级C++机试(继承和派生)模拟试卷5(题后含答案及解析) 题型有:1. 选择题选择题1.下列有关继承和派生的叙述中,正确的是( )。
A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类正确答案:D解析:止b题考查的是继承和派生。
无论是哪种继承方式,派生类都能够访问基类的公有和保护成员,而不能访问基类的私有成员,故选项A和B错误;公有继承时,基类的对象不可作为派生类的对象处理,即基类对象不可赋值给派生类对象,所以选项C错误。
知识模块:继承和派生2.在类声明中,紧跟在“public;”后声明的成员的访问权限是( )。
A.私有B.公有C.保护D.默认正确答案:B解析:类中提供了3种访问控制的权限:公有。
私有和保护。
其中公有类型定义了类的外部接口,任何一个外部的访问都必须通过外部接口进行。
私有类型的成员只允许本类的成员函数访问,来自类外部的任何访问都是非法的,保护类型介于公有类型和私有类型之间,在继承和派生时可以体现出其特点。
知识模块:继承和派生3.有如下类定义:class XX{int xdata;public:XX(int n=0):xdata(n){}};class YY:public XX{int ydata;public:YY(int m=0,int n=0):XX(m),ydata(n){}};YY类的对象包含的数据成员的个数是( )。
A.1B.2C.3D.4正确答案:B解析:因为类XX包括一个数据成员xdata,而类YY继承自类XX,所在类YY中也包含数据成员xdata,同时类YY中也定义了其本身的数据成员ydata,因而YY类的对象包含的数据成员的个数是2。
知识模块:继承和派生4.下列关于基类和派生类关系的叙述中,正确的是( )。
c++继承与派生习题答案
1.概念填空题1。
1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。
1。
2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。
当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员.1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体.1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。
在派生类中采用虚基类或作用域分辨符来消除该问题.2.简答题2.1 派生类如何实现对基类私有成员的访问?2。
2什么是类型兼容规则?2.3派生类的构造函数是怎样的执行顺序,析构函数的执行顺序是如何实现的?2.4继承与组合之间的区别与联系是什么?2.5什么是虚基类?它有什么作用?含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化?3.选择题3.1下面对派生类的描述中,错误的是(D ).A.一个派生类可以作为另外一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变3.2下列对友元关系叙述正确的是(A)。
A.不能继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系D.提高程序的运行效率3。
3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。
A.任何成员B.公有成员和保护成员C.公有成员和私有成员D.私有成员3.4设置虚基类的目的是(B).A.简化程序B.消除二义性C.提高运行效率D.减少目标代码3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( C )。
C++继承与派生类习题
第九章继承与派生类9.2 典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
无论是单继承还是多继承,派生类至少有一个基类。
派生类的成员除了它自己的成员外,还包含了它的基类成员。
派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
例题2:派生类的对象对它的哪一类基类成员是可以访问的?()A.公有继承的基类的公有成员B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员答案:A分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。
例题3:关于多继承二义性的描述,()是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性答案:D分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。
C++面向对象程序设计第8章 继承与派生
蚌埠学院计算机系
C++面向对象程序设计
class Studend1 可以看出,很多是重复的地方, 我们可以通过C++语言中的 { int num; //此行原来己有 继承机制,可以扩充和完善旧 char name[20]; //此行原来己有 的程序设计以适应新的需求。 char sex; //此行原来己有 这样不仅可以节省程序开发的 时间和资源,并且为未来程序 int age; 增添了新的资源。 char addr[20]; public: void display( ) ; //此行原来己有 {cout<<"num: "<<num<<endl; //此行原来己有 cout<<"name: "<<name<<endl;//此行原来己有 cout<<"sex: "<<sex<<endl; //此行原来己有 cout<<"age: "<<age<<endl; cout<<"address: "<<addr<<endl;} };
蚌埠学院计算机系
21
C++面向对象程序设计
【例8-3】定义类Point,然后定义类Point的派生类 Circle。 #include <iostream.h> class Point //定义基类,表示点 { private: int x; int y; public: void setPoint(int a, int b){ x=a; y=b; }; //设置坐标 int getX(){ return x; }; //取得X坐标 int getY(){ return y; }; //取得Y坐标 };
《C++程序设计》电子教案第5章 继承和派生
// 使用基类成员i,j
// 使用基类成员i,j
4.私有继承和保护继承
私有继承:派生类对基类的私有继承使用关键 字private描述(可缺省),基类的所有公有段 和保护段成员都成为派生类的私有成员。 保护继承:派生类对基类的保护继承使用关键 字protected描述,基类的所有公有段和保护段 成员都成为派生类的保护成员,保护继承在程 序中很少应用。
常用的三种继承方式:
1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类 的成员时,它们都保持原有的状态,而基类的私有成员 仍然是私有的。 2.私有继承(private) 私有继承的特点是基类的公有成员和保护成员作为派生类 的私有成员,并且不能被这个派生类的子类访问。 3.保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员都成为 派生类的保护成员,并且只能被它的派生类成员函数或 友元访问,基类的私有成员仍然是私有的。
第5章 继承和派生
5.1 5.2 5.3 5.4
基类和派生类 单继承 多继承 虚基类
5.1 基类和派生类
5.1.1 5.1.2 5.1.3 5.1.4
派生类的定义格式 派生类的三种继承方式 访问控制 基类和派生类的关系
返回首页
称已存在的用来派生新类的类为基类,又称为 父类。由已存在的类派生出的新类称为派生类, 又称为子类。派生类可以具有基类的特性,共 享基类的成员函数,使用基类的数据成员,还 可以定义自己的新特性,定义自己的数据成员 和成员函数。
public: void initr(float x,float y,float w,float h) { initp(x,y); //调用基类的公有成员 W=w;H=h; } float getH(){return H;} float getW(){return W;} private: float W,H; }; void main() { rectangle rect; rect.initr(2,3,20,10); rect.move(3,2); cout<<"the data of rect(x,y,w,h):"<<endl; cout<<rect.getx()<<","<<rect.gety()<<","<<rect.getW()<<"," << rect.getH()<<endl; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-7-15
6
C++的继承关系
• • 继承就是在一个已经存在的类的基础上建 立另一个新的类。 已存在的类称为“基类”或“父类”,新 建立的类称为“派生类”或“子类”,如 图所示:
基类 派生类
2013-7-15
7
派生类的特性
• 派生类的功能主要通过以下方式来体现:
– 吸收基类成员 – 改造基类成员 – 添加新成员
2013-7-15
30
需要思考的两个问题
• 为什么是“派生类对象->基类对 象”,而不是“基类对象->派生 类对象”?
• 其他继承方式会有以上规则吗?
2013-7-15
31
解决第一个问题
• 基类对象和派生类对象的内存布局方式
基类对象
v1 v2
v1 v2
派生类对象
v3 v4
•
当一个派生类对象直接赋值给基类对象时, 不是所有的数据都赋给了基类对象,赋予 的只是派生类对象的一部分。这部分叫做 派生类对象的“切片”(sliced)。
}
2013-7-15
19
保护派生类
• 在声明派生类时将继承方式指定为 protected时,该类称为保护派生类:
class 派生类名 : protected 基类名 {
……//派生类新添加的成员
};
2013-7-15
20
• 基类的成员在保护派生类中的引用权限
基类 保护派生类 公有成员 保护成员 私有成员 不可访问成员 保护成员 保护成员
2013-7-15 2
现实中的继承与派生
• 在自然界中,继承这个概念是非常普 遍的。例如:小猫仔继承了猫爸猫妈 的特性,所以长的是猫鼻子猫眼,我 们不会把它错认为是小狗。 继承就是将一些本质的特性遗传给子 代,使后代在很大程度上具有与父代 相同的性质。
•
•
子代同时还具有父代没有的特性。
3
2013-7-15
2013-7-15 13
私有派生类
• 在声明派生类时将继承方式指定为 private时,该类称为私有派生类。
class 派生类名 : private 基类名 { ……//派生类新添加的成员 };
2013-7-15
14
• 基类的成员在私有派生类中的引用权限
基类 私有派生类 公有成员 私有成员 私有成员 不可访问成员 保护成员 私有成员
……
对象成员n(参数表),
{ • }
•
如果基类使用的是缺省的构造函数或不带参 ……//初始化自定义数据成员 数的构造函数,那么在初始化列表中可以省 略“基类构造函数(参数表)“这一项。 如果没有对象成员,那么在初始化列表中可 2013-7-15 26 以省略“对象成员(参数表)“这一项。
构造函数和析构函数的调用顺序
2013-7-15
21
小结
• 不同的继承方式,子类对基类中的成 员的访问权限如下表所示:
基类 公有派生类 保护派生类 私有派生类 公有成员 私有成员 公有成员 不可访问成员 保护成员 不可访问成员 私有成员 不可访问成员 保护成员 保护成员 保护成员 私有成员
2013-7-15
22
派生类与基类同名成员的访问方式
• 为了解决这个问题,C++专门设置了 保护成员,即用protected关键字说 明的成员。 • 保护成员的特性:
– 能够被基类和派生类所访问。
– 和私有成员一样,类外不能访问。
2013-7-15
18
举例:保护成员
class Base{ class Derived : public Base{ protected: int v3; int v1; public: public: int v4; int v2; Derived(int a=0,int b=0){ Base(int a=0,int b=0){ v3=a;v4=b; v1=a;v2=b; } } void func(){ }; int sum1=v1+v2+v3+v4; //正确 void main( ){ int sum2=v2+v3+v4; Derived obj(5,6); } obj.v1=8; //错误 };
– 一旦指定了某种事物父代的本质特 征,那么它的子代将会自动具有那 些性质。这就是一种朴素的可重用 的概念。 – 而且子代可以拥有父代没有的特性, 这是可扩充的概念。
2013-7-15
5
• 从软件设计的角度来看:
– 类是某类事物共同特性的体现,它 对外提供了特定的功能。
– 基于已有的类,可以建立新的类。 这个新的类既重用已有类的功能, 又扩展了新的功能。
28
请分析
class derived:public base{ class base{ int a; int x; public: public: derived(int i):a(i*4),base(a){ base(int i):x(i){ cout<<"derived\n"; cout<<"base\n"; } } }; };
• 构造函数的调用顺序如下:
– 先调用基类构造函数; – 再调用对象成员所属类的构造函数; – 最后调用派生类构造函数;
• 析构函数的调用顺序如下:
– 先调用派生类的析构函数; – 再调用对象成员所属类的析构函数;
2013-7-15
– 最后调用基类的析构函数;
27
举例
class Base{ public: Base() { cout<<“Base created\n”;} }; class Derived:public Base{ public: Derived(){ cout<<“Derived created\n”; } }; void main(){ Derived d; } 2013-7-15
32
2013-7-15
解决第二个问题
• 回忆一下不同的继承方式,子类对基类中 的成员的访问权限:
公有成员 公有成员 私有成员 不可访问成员 保护成员 保护成员
基类 公有派生类
私有派生类
保护派生类
私有成员
保护成员
不可访问成员
不可访问成员
私有成员
保护成员
•
只有在公有派生的情况下,才有可能出现 “基类的公有成员变成派生类的公有成员” 的情况。
2013-7-15
15
举例:私有派生
class Base{ class Derived : private Base{ int v1; int v3; public: public: int v2; int v4; Base(int a=0,int b=0){ Derived(int a=0,int b=0){ v1=a;v2=b; v3=a;v4=b; } } }; void func(){ void main( ){ int sum1=v1+v2+v3+v4; //错误 Derived obj(5,6); int sum2=v2+v3+v4; obj.v2=8; //错误 } };
•
从编码的角度来看,派生类从基类中以 较低的代价换来了较大的灵活性。一旦 产生了可靠的基类,只需要调试派生类 中所作的修改即可。派生类可以对继承 的属性进行扩展、限制或改变。
2013-7-15 8
单继承和多继承
• 单继承:派生类只有一个直接基类
• 多继承:派生类有多个直接基类
A
B C X Z 多继承
10
2013-7-15
公有派生类
• 在声明派生类时将继承方式指定为 public时,该类称为公有派生类。 class 派生类名 : public 基类名
{
……//派生类新添加的成员
};
2013-7-15
11
• 基类的成员在公有派生类中的引用权限
基类 公有派生类 公有成员 公有成员 私有成员 不可访问成员 保护成员 保护成员
• C++允许派生类可以重新定义基类的成 员,此时称派生类的成员覆盖了基类的 同名成员。 如果在派生类中,想使用基类的同名成 员,则可以显式地使用类名+限定符的 方式,如下所示: 基类名::成员
•
2013-7-15
23
举例
class Base{ class Derived : public Base{ protected: int v2; int v1; public: public: int v3; int v2; Derived(int a=0,int b=0){ Base(int a=0,int b=0){ v2=a;v3=b; v1=a;v2=b; } } void func(){ }; //使用的是Derived中的v2 void main( ){ int sum1=v1+v2+v3; Derived obj(5,6); //使用的是Base中的v2 obj.v2=8; //错误 int sum2=v1+Base::v2+v3; obj.Base::v2=9; } 2013-7-15 24 } };
33
2013-7-15
多继承派生类
• 派生类有多个直接基类,这叫多继承。
Quadrangle Quadrangle
Rectangle
Diamond
Square
2013-7-15
34
• 定义多继承派生类的语法格式:
class 派生类名 : <继承方式1> 基类名1, <继承方式2> 基类名2, …… {
•
再来看一个现实世界中的例子: