C继承与派生类习题

合集下载

国家二级C++机试(继承和派生)模拟试卷8(题后含答案及解析)

国家二级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++练习题(带答案)

c++练习题(带答案)

一、选择题1.C++语言属于( C )。

A)自然语言 B)机器语言 C)面向对象语言D)汇编语言2.下面选项中不属于面向对象程序设计特征的是(C) 。

A)继承性 B)多态性 C)相似性 D)封装性3.可用作C++语言用户标识符的一组标识符是( B )。

A) void define +WORD B) a3_b3 _123 YNC) for -abc Case D) 2a DO sizeof4.假定一个二维数组的定义语句为“inta[3][4]={{3,4},{2,8,6}};”,则元素a[2][1]的值为(A)。

A) 0 B) 4 C) 8 D) 65.下列情况中,哪一种情况不会调用拷贝构造函数( B )?A)用派生类的对象去初始化基类对象时B)将类的一个对象赋值给该类的另一个对象时C)函数的形参是类的对象,调用函数进行形参和实参结合时D)函数的返回值是类的对象,函数执行返回调用者时6.以下哪一关键字可用于重载函数的区分(C)A)extern B)static C)const D)virtual7.下列有关数组的叙述中,正确的是( B )A)C++中数组的存储方式为列优先存储B)数组名可以作为实参赋值给指针类型的形参C)数组下标索引从1开始,至数组长度n结束D)数组指针的语法形式为:类型名 *数组名[下标表达式];8.下列有关继承和派生的叙述中,正确的是( C )A)派生类不能访问通过私有继承的基类的保护成员B)多继承的虚基类不能够实例化C)如果基类没有默认构造函数,派生类就应当声明带形参的构造函数D)基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现9.实现运行时多态的机制是( A )A)虚函数B)重载函数C)静态函数D)模版函数10.若有下面的函数调用:fun(a+b, 3, max(n-1, b));其中实参的个数是( A)A)3 B)4 C)5 D)611.下列关于this指针的说法正确的是( B)A)this指针存在于每个函数之中B)在类的非静态函数中this指针指向调用该函数的对象C)this指针是指向虚函数表的指针D)this指针是指向类的函数成员的指针12.在下列关于C++函数的叙述中,正确的是(C)A)每个函数至少要有一个参数B)每个函数都必须返回一个值C)函数在被调用之前必须先声明D)函数不能自己调用自己13.下列运算符中,不能重载的是(C)A)&& B)!= C). D)->14.下面程序的输出结果是(B)#include <iostream>using namespace std;int i = 0;int fun(int n){static int a = 2;a++;return a+n;}void main(){int k = 5;{int i = 2;k += fun(i);}k += fun(i);cout << k;}A)13 B)14 C)15 D)1615.下面的程序段的运行结果为(D)char str[] = "job", *p = str;cout << *(p+2) << endl;A)98 B)无输出结果 C)字符’b’的地址 D)字符’b’16.下面程序的输出结果是( C )#include <iostream>using namespace std;class A{public:A (int i) { x = i; }void dispa () { cout << x << “,”; }private :int x ;};class B : public A{public:B(int i) : A(i+10) { x = i; }void dispb() { dispa(); cout << x << endl; }private :int x ;};void main(){B b(2);b.dispb();}A)10,2 B)12,10 C)12,2 D)2,217.下面程序的输出结果是( C)?#include <iostream>using namespace std;class Base{public:Base(int i) { cout << i; }~Base () { }};class Base1: virtual public Base{public:Base1(int i, int j=0) : Base(j) { cout << i; }~Base1() {}};class Base2: virtual public Base{public:Base2(int i, int j=0) : Base(j) { cout << i; }~Base2() {}};class Derived : public Base2, public Base1{public:Derived(int a, int b, int c, int d) : mem1(a), mem2(b), Base1(c), Base2(d), Base(a){ cout << b; }private:Base2 mem2;Base1 mem1;};void main() { Derived objD (1, 2, 3, 4); }A)134122 B)123412 C)14302012 D)14321218.下面程序的输出结果是(C)#include <iostream>using namespace std;class Base{public:virtual void f() { cout << “f0+”; }void g() { cout << “g0+”; }};class Derived : public Base{public:void f() { cout << “f+”; }void g() { cout << “g+”; }};void main() { Derived d; Base *p = &d; p->f();p->g(); }A)f+g+ B)f0+g+ C)f+g0+ D)f0+g0+19.下面程序的输出结果是( C )#include <iostream>using namespace std;class Sample{friend long fun (Sample s){if (s.x < 2) return 1;return s.x * fun(Sample(s.x-1));}public:Sample (long a) { x = a; }private:long x;};void main(){int sum = 0;for (int i=0; i<4; i++){sum += fun(Sample(i));}cout << sum;}A)12 B)16 C)10 D)34 20.以下程序的输出结果是:(D)#include <iostream>using namespace std;int fun(char *s){ char *p=s;while (*p!='\0') p++;return (p-s);}void main(){cout<<fun("abc")<<endl;}A.0 B. 1 C. 2 D. 321.有如下程序段:int i=1;while(1){i++;if (i==10) break;if(i%2==0) cout<<’*’;}执行这个程序段输出字符*的个数是(C)A. 10B. 3C. 4D.522.下列关于虚基类的描述中,错误的是(C)A. 使用虚基类可以消除由多继承产生的二义性B. 构造派生类对象时,虚基类的构造函数只被调用一次C. 声明 class B:virtual public A 说明类B为虚基类D. 建立派生类对象时,首先调用虚基类的构造函数23.有下类定义Class A {Char *a;Public:A():a(0){}A(char *aa) {//把aa所指字符串拷贝到a所指向的存储空间A=___________________;Strcpy(a,aa);~A() {delete [] a;}};正确的选择是(A)A. new char[strlen(aa)+1]B. char[strlen(aa)+1]C. char[strlen(aa)]D. newchar[sizeof(aa)-1]24.假定AA为一个类,a为该类私有的数据成员,GetValue( )为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为(d )。

C++选择题练习

C++选择题练习

继承练习1.在派生类对基类继承的传递性中,C 是错误的。

(2分)A 在公有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员B 在公有继承方式下,间接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员C 在私有继承方式下,间接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员D 不管是私有继承还是公有继承,基类中的私有成员在派生类的作用域内都是不可能见的。

2.下列有关继承和派生的叙述中,正确的是:C (2分)A 派生类不能访问通过私有继承的基类的保护成员B 多继承的虚基类不能够实例化C如果基类没有默认构造函数,派生类就应当定义带形参的构造函数D 类的的析构函数和虚函数都不能够被继承,需要在派生类中重新实现第一次上机课3.设x和y均为bool量,则x&&y为真的条件是(A)。

(2分)A它们均为真B其中一个为真C它们均为假D其中一个为假4.设int x;,则经过(C)后,语句*px=0;可将x值置为0。

(2分)A int * px;B int const * px=&x;C int * const px=&x;D const int * px=&x;第三次上机课2-1在以下哪种情形,复制构造函数会被调用。

( B )(2分)A当一个对象采用引用方式,作为参数传递给一个函数B当一个函数采用值方式,返回一个对象C当一个对象赋值给另一个对象D以上答案都不对2-2对于以下关于友元的说法(D)(2分)A如果函数fun被声明为类A的友元函数,则该函数成为A的成员函数B如果函数fun被声明为类A的友元函数,则该函数能访问A的保护成员,但不能访问私C如果函数fun被声明为类A的友元函数,则fun的形参类型不能是A。

D以上答案都不对2-3对于类之间的友元关系:(D)(2分)A如果类A是类B的友元,则B的成员函数可以访问A的私有成员B如果类A是类B的友元,则B也是A的友元。

大学C 上机实验题目(版)

大学C 上机实验题目(版)

20XX年复习资料大学复习资料专业:班级:科目老师:日期:实验前言(建议认真阅读)一、上机实验的目的上机实验的目的是提高学生的分析问题、解决问题的能力和动手能力,通过实践环节理解C++语言的基本结构和程序设计方法。

通过亲手编程掌握C++语言编程的方法。

二、实验基本内容为了使学生在上机实验时目标明确,本实验指导书针对课程内容编写了五个实验。

学生在课内机时先完成指导书中标有“*”号的程序,理解所学的知识,在此基础上再编写其他应用程序。

指导书中的五个个实验如下:1. 函数与编译处理2. 指针与引用3. 类和对象4. 继承和派生类5. 多态性三、实验提交(特别提醒)1. 实验题目以附件形式提交,每个附件限一个源程序,附件以实验编号-题号-自己学号.cpp命名;如学号为20XXXX20XXXX20XXXX34的同学提交实验1的第5题,则附件命名方式为:1-5-20XXXX20XXXX20XXXX34.cpp,错误提交的将视为未提交。

2. 提交时间定为该次实验课的一周内,过期不再接收。

四、评分和作弊处理1. 要求提交实验题总数为6题(带“*”号),占期末总评成绩的20XX%;2. 存在抄袭和被抄袭的作业,无论抄袭与被抄袭者,本门课程平时成绩以零分记。

存在两次及两次以上抄袭和被抄袭者,本门课程以不及格记。

五、实验课要求(重点强调)1. 严禁QQ、MSN等即时软件工具聊天;2. 严紧接听手机、发送短信;3. 严紧玩游戏。

实验1 函数与编译处理一、实验目的1. 掌握函数声明、定义和使用的方法;2. 掌握形参与实参之间的对应关系;3. 掌握函数调用时,形参、实参之间的“值传递”和“引用传递”的区别;4. 掌握函数递归调用的方法;5. 掌握全局变量、局部变量、静态变量的使用方法;6. 掌握文件包含的使用方法。

二、实验内容1. 定义两个函数swap1和swap2,目的是实现两个整数的次序交换,其中swap1的参数是传递值参数,swap2的参数是引用参数,在程序中分别调用这两个函数,其输出结果如下所示:初始值:x=1,y=2调用swap1后的结果:x=1 y=2调用swap2后的结果:x=2 y=12. 编写一个函数,用来计算从键盘上输入的整数的阶乘。

面向对象程序设计C课后题答案

面向对象程序设计C课后题答案

第一章:面向对象程序设计概述[1_1]什么是面向对象程序设计?面向对象程序设计是一种新型的程序设计范型。

这种范型的主要特征是:程序=对象+消息。

面向对象程序的基本元素是对象,面向对象程序的主要结构特点是:第一:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。

第二:程序中的一切操作都是通过向对象发送消息来实现的,对象接受到消息后,启动有关方法完成相应的操作。

面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的思维方式。

这种方法的提出是软件开发方法的一场革命,是目前解决软件开发面临困难的最有希望、最有前途的方法之一。

[1_2]什么是类?什么是对象?对象与类的关系是什么?在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。

对象可以认为是:数据+操作在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。

类和对象之间的关系是抽象和具体的关系。

类是多个对象进行综合抽象的结果,一个对象是类的一个实例。

在面向对象程序设计中,总是先声明类,再由类生成对象。

类是建立对象的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。

[1_3]现实世界中的对象有哪些特征?请举例说明。

对象是现实世界中的一个实体,其具有以下一些特征:(1)每一个对象必须有一个名字以区别于其他对象。

(2)需要用属性来描述它的某些特性。

(3)有一组操作,每一个操作决定了对象的一种行为。

(4)对象的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他对象的操作。

例如:雇员刘名是一个对象对象名:刘名对象的属性:年龄:36 生日:1966.10.1 工资:2000 部门:人事部对象的操作:吃饭开车[1_4]什么是消息?消息具有什么性质?在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。

派生类

派生类

继承与派生类1 知识要点1.掌握继承和派生的定义,派生类的定义方法。

(1)掌握继承的两种类型:单继承和多继承。

(2)掌握private,public,protected三种继承方式的特点。

继承方式决定了基类中的成员在派生类中的属性。

三种继承方式的共同点:基类的private成员在派生类中不可见。

区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

(3)掌握派生类中的构造函数和析构函数的使用。

基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。

派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。

(4)掌握派生类的同名覆盖规则。

(5)掌握赋值兼容规则。

基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。

2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。

3.掌握虚基类的概念和定义方法。

在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。

2 典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。

C++习题3(继承和多态)

C++习题3(继承和多态)

C++习题3(继承和多态)C++习题3(继承和多态)一、选择题1、在C++中,类与类之间的继承关系具有( C )A)自反性 B)对称性 C)传递性 D)反对称性2、在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制 B)保持不变 C)受保护 D)不受保护3、按解释中的要求在下列程序划线处填入的正确语句是:( C )#include class Base{public:void fun(){cout<<"Base::fun"<<=""> fun()cout<<"Derived::fun"<fun();4、在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C )A)受限制 B)保持不变 C)受保护 D)不受保护5、在哪种派生方式中,派生类可以访问基类中的protected 成员(B )A)public和private B)public、protected和private C)protected和private D)仅protected6、当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A)public成员 B)private成员 C)protected成员 D)友元7、不论派生类以何种方法继承基类,都不能使用基类的(B )A)public成员 B)private成员 C)protected成员 D)public成员和protected成员8下面叙述错误的是(S )。

A )基类的protected成员在派生类中仍然是protected的 B)基类的protected成员在public派生类中仍然是protected的C)基类的protected成员在private派生类中是private的 D)基类的protected 成员不能被派生类的对象访问9、下列说法中错误的是(S )。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第九章继承与派生类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分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。

消除二义性的方法是采用作用域运算符。

派生类和它的基类中出现同名函数时,不可能出现二义性。

例题4:多继承派生类构造函数构造对象时,()被最先调用。

A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数D.派生类中子对象类的构造函数答案:E分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数, 派生类自己的构造函数。

例题5: C++类体系中,能被派生类继承的是()。

A.构造函数B.虚函数C.析构函数D.友元函数答案:E分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的. 例题6:设有基类定义:class Cbase{private: i nt a;protected: i nt b;public: i nt c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员()A.私有继承B.保护继承C.公有继承D.私有、保护、公有均可答案:A分析:私有继承时,基类的protected成员在派生类中作为private成员。

例题7:C++将类继承分为(])和(2 )两种。

答案:(1 )单继承(2 )多继承分析:派生类可以只从一个基类中派生,也可以从多个基类中派生。

从一个基类中派生的继承方式称为单继承。

从多个基类中派生的继承方式称为多继承。

例题8:派生类可以定义其___________________ 中不具备的数据和操作。

答案:基类分析:派生类是从基类派生的,派生类包含了它所有基类的除构造函数、析构函数之外的所有成员,同时还拥有它自己的新成员。

例题9:派生类构造函数的初始化列表中包含__________________________________ (答案:初始化基类数据成员、新增内嵌对象数据及新增一般成员数据所需要的全部参数。

例题10:在继承机制下,当对象消亡时,编译系统先执行血的析构函数,然后才执行(2h的析构函数,最后执行(3L的析构函数。

答案:(1)派生类(2)派生类中子对象类(3)基类分析:派生类的析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。

例题11:设有以下类的定义:class Aclass B: protected Aclass C: private B{intA1;{int b1;{int c1;protected/nt A2;protected: i nt b2;protected: i nt c2;public:i nt A3;public: i nt b3;public: i nt c3;};};};请按访问权限写出派生类C中具有的成员。

私有成员:⑴保护成员:(2)公有成员:(3L。

答案:(1)c1、b2、b3、A2、A3(2)c2(3)c3分析:E类有它自己的私有成员b1、保护成员b2和公有成员有b3,另外E类是以保护方式从A类中派生出来的,所以A类保护成员A 2和公有成员A3在E类中都变成保护类型的;C类有自己的私有成员c1、保护成员c2和公有成员有c3,C类是以私有方式从B类中派生出来的,所以E类中的b2、b3、A2和A3在C类中都变成私有的访问方式。

例题12:指出并改正下面程序中的错误。

#include<>class Point{int x,y;public:Point(int a=0,int b=0) {x=a; y=b;}void move(int xoffset,int yoffset) {x+=xoffset; y+=yoffset;} int getx() {return x;} int gety() {return y;}};class Rectangle:protected Point{int length,width;public:Rectangle(int x,int y,int l,int w):Point(x,y){length=l;width=w;}int getlength(){return length;}int getwidth(){return width;}};void main(){ Rectangle r(0,0,8,4);(23,56);cout<<()<<","<<()<<","<<()<<","<<()<<endl;}分析:保护继承方式使基类的public 成员在派生类中的访问属性变为protected ,所以派生类Rectangle 的对象r 不能直接访问基类的成员函数move() 、getx() 和gety() 。

其改正方法有两种:1)将Rectangle 的继承方式改为公有继承public ;2)在Rectangle 类中重定义move() ,getx() 和gety() 函数,覆盖基类的同名函数。

void Rectangle::move(int xoffset,int yoffset){Point::move(xoffset,yoffset);}void Rectangle::getx(){return Point::getx();}void Rectangle::gety(){return Point::gety();}例题13:指出并改正下面程序中的错误。

#include<>class A{ public:int x;A(int a=0) {x=a;}void display() { cout<<"="<<x<<endl; }};class B{ public:int x;B(int a=0) {x=a;}void display() {cout<<"="<<x<<endl; } };class C:public A,public B{int y;public:C(int a,int b,int c) :A(a),B(b){y=c;}int gety() { return y; }};void main(){ C myc(1,2,3);=10;();}分析:类A、B 中有同名公有数据成员x 和同名成员函数display() 访问对象myc的数据成员x是无法确定是访问从A中继承的还是从调用成员函数也是如此,无法确认是调用类A中的还是类B中的, 改正方法,可以用作用域区分符加以限定,如改成::x=10;或::x=10; ::display() ;例题14:看程序写结果,在主函数中B 中继承的x;产生二义性。

::display();#include <>class Base{int i;public:Base(int n){cout <<"Constucting base class" << endl;i=n;}~Base(){cout <<"Destructing base class" << endl;}void showi(){cout << i<< ",";}int Geti(){return i;}};class Derived:public Base{int j;Base aa;public:Derived(int n,int m,int p):Base(m),aa(p){ cout << "Constructing derived class" <<endl; j=n;}~Derived(){cout <<"Destructing derived class"<<endl;} voidshow(){Base::showi();cout << j<<"," << () << endl;}};void main() { Derived obj(8,13,24);();}说明:派生类的构造函数的执行次序,先调用基类的构造函数,再调用派生类中子对象类的构造函数,最后调用派生类的构造函数。

析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。

相关文档
最新文档