c++实验8 继承与派生上机练习题
继承与派生练习题
习题八第八章继承与派生1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变)是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员)A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性)是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。
A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5. C++类体系中,能被派生类继承的是( B.虚函数)。
A.构造函数 B.虚函数 C.析构函数 D.友元函数6. 设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承)A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7. 指出下列对定义重载函数的要求中,哪些是错误的提法。
A.要求参数的个数不同B. 要求参数中至少有一个类型不同。
A.要求参数的个数不同。
B.要求参数中至少有一个类型不同。
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 第八章继承与派生习题习题解答
第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.6 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.2简答题(以下习题题号可能和教材不一致!)8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。
派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。
2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。
3.派生类的构造函数体中的操作。
8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。
国家二级C%2b%2b机试(继承和派生)模拟试卷8.doc
国家二级C++机试(继承和派生)模拟试卷8控制面板籍卷1。
0满分分:全部题型1 .选择题翳29选择题? 题里:1.有如下类定义:答题120class AA(时分int a:限:钟public:AA(intn=0): a(n){}剩余时间:};r class BB: public AA{L I public:号:BB(int n)____1;12 14 16 18其中横线处缺失部分是()。
20 A. : a(n) ()B. : AA(n) (}调整背景: C. (a(n) ; }D- {a=n; }正确答案:B解析:根据派生类构造函数的一般格式:<派生类名〉(V总参数表〉):V基类名1>(V参数表1>),…V基类名n>V参数表n>) , V成员对象名1>(V参数表n+l>) , V成员对象名m>(V参数表n+m>)V派生类构造函数体>。
在派生类BB的构造函数总参数表后面应该接上基类名AA和其参数。
2.有如下程序:#includc <iostrcam> usingnamespace std;答题卡I A B C D 2A B C D 3 A B C D 4A B C D 5 A B C D 6A B C D 7A B C D 8A B C D 9A B C D 10 A B C DII A B C D 12A B C D 13A B C D 14A B C D 15A B C D 16A B C D 17A B C D 18A B C D 19A B C D 20A B C D21A B C24 A B C D25 A B C D 26 A B C D 27 A B C Dclass 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, intb, intc, int d); Basel(b), Base2(a), bl(d), b2(c)() Private : int bl ; int b2;};int main()(Derived d(h 2, 3, 4); return 0; }运行时的输出结果是()。
C++(练习)第8章,继承与派生
C++(练习)第8章,继承与派生一,单选题1.下列描述中错误的是( )。
A 继承分为多重继承和单继承B 对象间通信靠传递消息实现C 在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征D 类是具有共同属性、共同方法的对象的集合参考答案C2. 设有以下定义:#includeclass A1{public:void show1() { cout<<"class A1"<<="">};class A2: public A1{public:void show2( ) { cout<<"class A2"<<="">};class A3: protected A2{public:void show3( ) { cout<<"class A3"<<="">};void main(){A1 obj1;A2 obj2;A3 obj3;...}以下不合法的调用语句是( )。
A obj1.show1();B obj2.show1();C obj3.show1();D obj2.show2();参考答案C3. 下列描述中哪个是正确的__________。
A 私有派生的子类无法访问父类的成员B 类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的C 私有派生类不能作为基类派生子类D 私有派生类的所有子孙类将无法继续继承该类的成员参考答案B4. 下面有关派生类的说法中,错误的是( )。
A 一个派生类可以作为另一个派生类的基类B 一个派生类可以有多个基类C 派生类构造函数可以将初始化参数值传递给基类的构造函数和对象成员的构造函数D 具有继承关系时,基类成员在派生类中的访问权限不变参考答案D5. 设置虚基类的目的是( )。
继承与派生
第7章——继承与派生一、选择题1.在c++中,类之间的继承关系具有( )。
(a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性2.下列关于类的继承描述中,( )是正确的。
(a) 派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。
(b) 派生类也是基类,所以它们是等价的。
(c) 派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。
(d) 一个基类可以有多个派生类,一个派生类可以有多个基类。
3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( )。
(a) public成员(b) private成员(c) protected成员(d) 友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。
(a) public成员(b) private成员(c) protected成员(d) 友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。
(a) public成员(b) private成员(c) protected成员(d)友员6.不论派生类以何种方式继承基类,都不能直接使用基类的()。
(a) public 成员(b) private成员(c) protected成员(d) 所有成员7.下面描述中,错误的是( )。
(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问。
(b) 在基类定义的protected成员在私有继承的派生类中可见。
(c) 在基类定义的公有静态成员在私有继承的派生类中可见。
(d) 访问声明可以在公有继承派生类中把基类的public成员声明为private成员。
8.在c++中,可以被派生类继承的函数是( = )。
(a) 成员函数(b)构造函数(c) 析构函数(d)友员函数9.在创建派生类对象时,构造函数的执行顺序是( = )。
(a) 对象成员构造函数—基类构造函数—派生类本身的构造函数(b) 派生类本身的构造函数—基类构造函数—对象成员构造函数(c) 基类构造函数—派生类本身的构造函数—对象成员构造函数(d) 基类构造函数—对象成员构造函数—派生类本身的构造函数10.当不同的类具有相同的间接基类时,( c )。
C++面向对象程序设计习题继承与派生
C++面向对象程序设计习题继承与派生继承与派生练习题1.什么是继承性?为什么说它是面向对象程序中的重要机制?所谓继承,就是从先辈处得到属性和行为特征。
2.C++中继承分为哪两个类?继承方式又分哪三种?基类和派生类public(公有)、private(私有)和protected(保护)继承3.三中继承方式中有哪些特点?不同基础更方式中派生类的对象对基类成员的访问有何不同?(1) 公有继承(public)方式:基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,而基类的私有成员在派生类中不可访问。
(2) 保护继承(protected)方式:基类中的公有成员和保护成员在派生类中都变成保护成员,而基类的私有成员在派生类中不可访问。
(3) 私有继承(private)方式:基类中的公有成员和保护成员在派生类中都变成私有成员,而基类的私有成员在派生类中不可访问。
因此,无论哪种继承方式,基类中的私有成员在派生类中都不允许访问,基类中的公有成员和保护成员都可以被派生类中的成员直接访问。
派生类对象对基类成员的访问1. 保护继承在类定义中,在关键字protected下说明的成员称为保护成员。
保护成员既具有私有的特性又具有公有的特性。
2. 公有继承在公有继承方式下,基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象只能访问基类的公有成员,不能访问基类的保护成员和私有成员。
3. 私有继承在私有继承方式下,基类中的公有成员和保护成员在派生类中都变成私有成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象不能访问基类的任何成员。
4.如何定义单继承的派生类?如何定义多继承的派生类?一个派生类只有一个直接基类,则该继承称为单一继承一个派生类有多个直接基类,则该继承称为多重继承5.派生类与基类之间有什么关系?在面向对象程序设计中,继承就是一个新类可以从现有类获得特征,从现有类产生新类的过程就是类的派生。
继承与派生练习题
习题八第八章继承与派生1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变)是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员)A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性)是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。
A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5. C++类体系中,能被派生类继承的是( B.虚函数)。
A.构造函数 B.虚函数 C.析构函数 D.友元函数6. 设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承)A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7. 指出下列对定义重载函数的要求中,哪些是错误的提法。
A.要求参数的个数不同B. 要求参数中至少有一个类型不同。
A.要求参数的个数不同。
B.要求参数中至少有一个类型不同。
C.不要求函数的返回值不同。
c 继承与派生习题答案
继承与派生概念填空题1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。
1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。
当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。
1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。
1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。
在派生类中采用虚基类或作用域分辨符来消除该问题。
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 )。
A.派生类的对象可以赋给基类的对象B.派生类的对象可以初始化基类的引用C.派生类的对象可以直接访问基类中的成员D.派生类的对象的地址可以赋给指向基类的指针3.6有如下类定义:class MyBASE{int k;public:void set(int n) {k=n;}int get( ) const {return k;}};class MyDERIVED: protected MyBASE{protected;int j;public:void set(int m,int n){MyBASE::set(m);j=n;}int get( ) const{return MyBASE::get( )+j;}};则类MyDERIVED中保护成员个数是(B)。
第3章继承和派生习题
A.派生类自己的构造函数B.虚基类的构造函数
C.非虚基类的构造函数D.派生类中子对象类的构造函数
5.C++类体系中,能被派生类继承的是( )。
A.构造函数B.虚函数C.析构函数D.友元函数
6.设有基类定义:
class Cbase
{ private:inta;
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码
25.下列虚基类的声明中,正确的是()。
A.classvirtual B:public AB.virtual classB:publicA
C.class B:publicAvirtualD.class B:virtual public A
26.若要用派生类的对象访问基类的保护成员,以下观点正确的是()
第3章-继承和派生习题
———————————————————————————————— 作者:
———————————————————————————————— 日期:
《面向对象程序设计》习题
班级:学号:姓名:名单序号:成绩:
第3章继承与派生
一、选择题(共28分,每题1分)
1.下列对派生类的描述中,()是错误的。
19.C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
A.复用B.继承C.封装D.引用
20.继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A.规律性B.传递性C.重复性D.多样性
21.下列对继承的描述中,错误的是()。
3.关于多继承二义性的描述,()是错误的。
继承和派生习题与解析
void car::show() {
cout <<" 车型:小车" << endl; vehicle::show(); cout << "载人:" << passenger_load << "人" << endl; cout << endl; } truck:: truck(int wheels, float weight,int passengers, float max_load):vehicle(wheels,weight) { passenger_load=passengers; payload=max_load; } int truck::get_passengers() { return passenger_load; } float truck::efficiency() { return payload/(payload+weight); }
输出结果 车型:小车 车轮:4个 重量:2000公斤 载人:5人
车型:卡车 车轮:10个 重量:8000公斤 载人:3人 效率:0.977012
7 设计一个圆类circle和一个桌子类table,另设计一 个圆桌类roundtable,它是从前两个类派生的,要求 输出一个圆桌的高度、面积和颜色等数据。
解: 本题说明单继承情况下构造函数和析构函数的调用
顺序。这里base为基类,subs为派生类。 所以输出为:
constructing base class constructing sub class destructing sub class destrcuting base class 注意:在单继承情况下,首先调用基类的构造函数 , 随后调用派生类的构造函数,析构函数的调用顺序则 正好相反。
继承与派生习题
继承与派生习题集1、如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问属性分别是( D )A)public和public B)public和protectedC)protected和public D)protected和protected解析:根据课本中定义,当派生类以protected方式继承基类时,则原基类的protected成员和public成员在派生类中的访问属性分别是protected和protected。
2、派生类的成员函数不能访问基类的( C )A)公有成员和保护成员B)公有成员C)私有成员D)保护成员解析:基类的私有成员无论以何种方式继承,在派生类中都是不可访问的。
3、在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是(C )A)派生类的对象可以赋给基类的对象B)派生类的对象可以初始化基类的引用C)派生类的对象可以直接访问基类中的成员D)派生类的对象的地址可以赋给指向基类的指针解析:基类与派生类对象可以相互转换,(1)派生类对象可以向基类对象赋值;(2)派生类对象可以向基类对象的引用进行赋值或初始化;(3)派生类对象的地址可以赋给指向基类对象的指针变量;(4)如果函数的参数是基类对象或基类对象的引用,相应得实参可以用子类对象。
4、在一个派生类对象结束其生命周期时(A)A)先调用派生类的析构函数后再调用基类的析构函数B)先调用调用基类的析构函数后再调用派生类的析构函数C)如果基类没有定义析构函数,则只调用派生类的析构函数D)如果派生类没有定义析构函数,则只调用基类的析构函数解析:在派生类对象释放时,先执行派生类析构函数,再执行其基类析构函数。
5、在声明派生类时,如果不显式地给出继承方式,缺省的类继承方式是私有继承private。
已知有如下类定义:class Base{ protected:void fun() {} };class Derived:Base {};则Base类中的成员函数fun() ,在Derived类中的访问权限是(A)A)private B)public C)friend D)protected解析:由于是私有继承,则基类中的保护成员在私有派生类中的访问属性为私有。
最新《C++程序设计案例教程》习题答案第8章 类的继承与派生
第8章类的继承与派生一、选择题1.D 2.A 3.A 4.B 5.B 6.B二、程序题(略)三、简答题1.派生类对基类的继承方式有哪些?在派生类中,成员有几种不同的访问属性?答:派生类对基类的继承方式有三种:public、protected、private。
成员也有三种访问属性:public、protected、private。
2.多级派生的访问属性如何确定?答:多级派生的访问属性确定的原则与单层派生一致。
3. 在执行派生类时,如何调用基类的构造函数?答:在派生类构造函数的初始化列表中描述。
4. 对数据成员初始化时,如何对子对象初始化?答:在派生类构造函数的初始化列表中,写上子对象名(实际参数)。
5.程序中有多重继承时,系统如何调用析构函数?答:按照调用构造函数相反的顺序调用析构函数。
6.举例说明多重继承引起的二义性,如何解决此问题?多重继承指一个类从多个基类中派生而来。
如果一个派生类有多个直接基类,而这些直接基类又都派生于同一个基类,则在最终派生类中会保留间接基类中的多份数据成员,从而导致在派生类中访问这些数据成员时,可能产生错误,即二义性的错误。
C++提供了虚基类(virtual base class)的方法来解决这个问题,使得派生类在获得间接基类的数据成员时只保留一份拷贝。
7. 谈谈虚基类的作用。
在进行多重继承时,为保证最终派生类中只继承一次,通常声明该基类为所有直接派生类的虚基类。
如果虚基类中定义了带参数的构造函数,则在其所有的派生类(直接派生类或者间接派生类)中,必须通过这些派生类的构造函数对虚基类构造函数调用。
但是,其实只有最后的派生类成功地调用了虚基类的构造函数,并对虚基类的数据成员进行了初始化,其余派生类中对虚基类的调用只是形式,以形成派生类构造函数声明格式的一致性,而没有真正调用虚基类的构造函数。
这就保证了虚基类的数据成员不会被多次初始化。
四、编程题分别声明Teacher类和Cadre类,采用多重继承方式由这两个类派生出新类TC类。
继承和派生习题
继承和派生习题一、单选题1.若类A和类B的定义如下:class A{int i,j;public:int geti(){return i;}};class B: public A{int k;public:void make(){k=i*j;}};则上述中,()是非法的表达式。
A.k=i*j B.int k; C.return i; D.void make();2.关于公有继承,下列说法错误的是()。
A.基类的公有成员和保护成员被继承后作为派生类的公有成员和保护成员。
B.派生类的其他成员可以直接访问基类的公有成员和保护成员。
C.派生类的对象可以访问基类的私有成员。
D.派生类成员和对象都无法访问基类的私有成员。
3.下列说法中错误的是()。
A.公有继承时基类中的public成员在派生类中仍是public的;B.公有继承时基类中的private成员在派生类中仍是private的;C.私有继承时基类中的public成员在派生类中是private的;D.保护继承时基类中的public成员在派生类中是protected的;4.在公有继承中,基类中的公有成员作为派生类的()。
A.公有成员B.私有成员C.保护成员D.私有成员函数5.基类中的()不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开放的接口。
A.公有成员B.私有成员C.保护成员D.私有成员函数6.在下面的表达式中,不表示虚继承的是()。
A.virtual publicB.public virtualC.publicD.virtual7.设置虚函数的声明中,正确的是()。
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码8.下面叙述错误的是()。
A.基类的protected成员在派生类中仍然是protectedB.基类的protected成员在public派生类中仍然是protected的C.基类的protected成员在private派生类中是private的D.基类的protected成员不能被派生类的对象访问9.派生类的对象对它的基类成员中()是可以访问的。
继承与派生类C试题
继承与派生类知识要点1.1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握priv ate,public,protec ted三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protec ted成员在派生类中作为private成员;对于公有继承,基类的pub lic、protec ted成员在派生类中访问属性不变;对于保护继承,基类的public、protec ted成员在派生类中作为protecte d成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
选择题(继承和派生)
继承和派生一、选择题1. 在C++中的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过(),派生出新的类。
A、复用B、继承C、单继承D、多继承答案:B2. 继承具有(),即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。
A、规律性B、传递性C、重复性D、多样性答案:B3. 对于虚函数的调用()A、一定使用动态联编B、一定使用静态联编C、必须使用动态联编D、不一定使用动态联编解析:虚函数只是实现动态联编的必要条件之一,只有在同时满足下面条件时,对虚函数的调用才是动态联编:动态联编调用才是动态联编:(1)类之间为基类和派生类关系(2)要有虚函数(1)类之间为基类和派生类关系(2)要有虚函数(3)调用虚函数操作的是对象的指针或者对象引用,或者是由成员函数调用虚函数。
如果不能同时满足以上条件,对虚函数的调用将采取静态联编。
4.下列描述中,()是抽象类的特征。
A、可以说明虚函数B、可以定义友元函数C、可以进行构造函数重载D、不能说明其对象解析:带有纯虚函数的类称为抽象类。
抽象类中的纯虚函数没有具体的定义,所以不能说明抽象类的对象。
这也是抽象类的特性。
答案:D5. 在多继承中,公有派生和私有派生对于基类成员在派生类中的可访问性与单继承的规则()。
A、完全相同B、完全不同C、部分相同,部分不同D、以上都不对答案:A6. 实现运行时的多态性要使用()A、构造函数B、析构函数C、重载函数D、虚函数解析:动态联编一直要到程序运行时才能确定调用哪个函数。
虚函数是实现动态联编的必要条件之一,没有虚函数一定不能实现动态联编。
答案:D7. 派生类的对象对它的基类成员中()中可以访问的。
A、公有继承的公有成员B、公有继承的私有成员C、公有继承的保护成员D、私有继承的公有成员解析:派生类的对象只能访问公有成员,而基类中的公有成员在公有继承方式下成为派生类的公有成员。
8. 派生类的构造函数的成员初始化列表中,不能包含()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.定义一个哺乳动物类Mammal,并从中派生出一个狗类Dog,下面给出Mammal类的定义,要求:(1)添加Dog类的颜色数据成员,访问属性为私有,通过SetColor和GetColor成员函数来对颜色进行设置和获取。
(2)分别为基类和派生类添加相应的构造函数(有参、无参)和析构函数,并进行测试。
class Mammal{protected:int itsAge;int itsWeight;public:int GetAge(){return itsAge;}void SetAge(int age) {itsAge=age;}int GetWeight() { return itsWeight;}void SetWeight(int weight) {itsWeight= weight;}};class Dog : public Mammal{//定义Dog类的数据成员和成员函数};改:#include <iostream.h>#include <string>using namespace std;class Mammal{protected:int itsAge;int itsWeight;public:Mammal();~Mammal();int GetAge(){return itsAge;}void SetAge(int age) {itsAge=age;}int GetWeight() { return itsWeight;}void SetWeight(int weight) {itsWeight= weight;}};class Dog : public Mammal{protected:char itscolor[20];public:Dog();void Setcolor(char *color) {strcpy(itscolor,color);}void getcolor(){cout<<"狗的颜色"<<itscolor<<endl;}//定义Dog类的数据成员和成员函数};////////////////////////Mammal::Mammal(){int age1,weight1;cout<<"请输入动物的年龄:"<<endl;cin>>age1;SetAge(age1);cout<<"请输入动物的体重:"<<endl;cin>>weight1;SetWeight(weight1);}Mammal::~Mammal(){cout<<"Destructor called."<<endl;}Dog::Dog(){char color[20];cout<<"请输入狗的颜色:"<<endl;cin>>color;Setcolor(color);cout<<"狗的颜色"<<itscolor<<"体重"<<GetWeight()<<"年龄"<<GetAge()<<endl; }void main(){Dog dog1;}(4)设计人员基类Person。
其成员包括:数据成员:姓名(字符数组)、性别(字符数组)和年龄(整型)成员函数:SetPerson,设置人员数据函数;DisplayPerson,显示人员数据函数;设计派生类1:Teacher,派生于Person。
新增成员包括:数据成员:职称(字符数组)、教研室(字符数组)和所授课程(字符数组)成员函数:SetTeacher,设置数据成员函数;DisplayTeacher,显示数据成员函数;设计派生类2:Student,派生于Person。
新增成员包括:数据成员:专业(字符数组)、班级(字符数组)和类别(int)其中类别取值:1(本科生)、2(硕士生)、3(博士生)成员函数:SetStudent,设置数据成员函数;DisplayStudent,显示数据成员函数;设计派生类3:PostDoctor(博士后),多重继承于Student与Teacher。
新增成员包括:数据成员:无成员函数:SetPostDoctor,设置数据成员函数;DisplayPostDoctor,显示数据成员函数;主函数:输入并输出一个教师、一个本科生、一个博士后数据。
#include <iostream.h>#include <string>using namespace std;#define n 20////////////类的定义class Person{protected:char name[n];char sex[n];int age;public:Person();void setperson();void displayperson();};class Teacher :virtual public Person{protected:char job[n];char room[n];char subject[n];public :Teacher();void setteacher();void displayteacher();};class Student:virtual public Person{protected:char major[n];char banji[n];int leibie;public :Student();void setstudent();void displaystudent();};class Postdoctor:public Teacher,public Student {public :Postdoctor();void setpostdoctor();void displaypostdoctor();};/////////////结构函数Person::Person(){setperson();}Teacher::Teacher(){setteacher();}Student::Student(){setstudent();}Postdoctor::Postdoctor(){}//////////////////设置数据//////////////////void Person::setperson(){cout<<"*****"<<"姓名:";cin>>name;cout<<"*****"<<"性别:";cin>>sex;cout<<"*****"<<"年龄:";cin>>age;}void Teacher::setteacher(){cout<<"*****"<<"职称:";cin>>job;cout<<"*****"<<"教研室:";cin>>room;cout<<"*****"<<"所授课程:";cin>>subject;}void Student::setstudent(){cout<<"*****"<<"专业:";cin>>major;cout<<"*****"<<"班级:";cin>>banji;cout<<"*****"<<"类别(1本科2硕士3博士):";cin>>leibie;}/////////////数据显示///////////void Person::displayperson(){cout<<"姓名:"<<name<<"性别:"<<sex<<"年龄:"<<age;}void Teacher::displayteacher(){displayperson();cout<<"职称:"<<job<<"教研室:"<<room<<"所授课程:"<<subject<<endl; }void Student::displaystudent(){displayperson();cout<<"专业:"<<major<<"班级:"<<banji<<"类别:"<<leibie<<endl;}void Postdoctor::displaypostdoctor(){displayperson();cout<<"职称:"<<job<<"教研室:"<<room<<"所授课程:"<<subject<<"专业:"<<major<<"班级:"<<banji<<"类别:博士后"<<endl;}///////////////////void main(){cout<<"您正在输入一个老师的信息:"<<endl;Teacher t1;cout<<"************************************************************************ ***syy割"<<endl;cout<<"您正在输入一个学生的信息:"<<endl;Student s1;cout<<"************************************************************************ ***syy割"<<endl;cout<<"您正在输入一个博士后的信息:"<<endl;Postdoctor p1;cout<<"************************************************************************ ***syy割"<<endl;cout<<endl;t1.displayteacher();cout<<endl;s1.displaystudent();cout<<endl;p1.displaypostdoctor();}。