C++继承与派生类习题

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

一个基类。派生类的成员除了它自己的成员外,还包含了它的基类成员。派生类中继承的基
类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的 public,protected 成
员在派生类中作为 private 成员;对于公有继承,基类的 public,protected 成员在派生类中访
问属性不变;对于保护继承,基类的 public、protected 成员在派生类中作为 protected 成员。
void Rectangle::getx(){return Point::getx();}
void Rectangle::gety(){return Point::gety();}
例题 13:指出并改正下面程序中的错误。 #include<iostream.h> class A { public:
int x;
例题 11:设有以下类的定义:
class A
class B: protected A class C: private B
{ int A1;
{ int b1;
{ int c1;
protected: int A2; protected: int b2; protected: int c2;
public: int A3; public: int b3;
{
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;}
第九章继承与派生类
9.2 典型例题分析与解答
例题 1:下列对派生类的描述中,( )是错误的。
A. 一个派生类可以作为另一个派生类的基类
B. 派生类至少有一个基类
C. 派生类的成员除了它自己的成员外,还包含了它的基类成员
D. 派生类中继承的基类成员的访问权限到派生类保持不变
答案:D
分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有
};
void main()
{ Rectangle r(0,0,8,4);
r.move(23,56);
cout<<r.getx()<<","<<r.gety()<<","
<<r.getlength()<<","<<r.getwidth()<<endl;
}
分析:保护继承方式使基类的 public 成员在派生类中的访问属性变为 protected,所以派生类
它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基
类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。
例题 3:关于多继承二义性的描述,( )是错误的。 A. 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性 B. 一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的 访问可能出现二义性 C. 解决二义性最常用的方法是作用域运算符对成员进行限定 D. 派生类和它的基类中出现同名函数时,将可能出现二义性
j=n;
} ~Derived(){cout <<"Destructing derived class"<<endl;} void show(){Base::showi();
cout << j<<"," << aa.Geti() << endl;} }; void main() { Derived obj(8,13,24); obj.show(); } 说明:派生类的构造函数的执行次序,先调用基类的构造函数,再调用派生类中子对象类的 构造函数,最后调用派生类的构造函数。析构函数的执行次序与构造函数正好相反,先调用 派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。 运行结果: Constucting base class Constucting base class Constructing derived class 13,8,24 Destructing derived class Destructing base class Destructing base class
例题 2:派生类的对象对它的哪一类基类成员是可以访问的?( )
A.公有继承的基类的公有成员
B. 公有继承的基类
的保护成员
C. 公有继承的基类的私有成员
D. 保护继承的基
类的公有成员
答案:A
分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问
它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问
分析:C++ 类 体 系 中 , 构 造 函 数 、 析 构 函 数 和 友 元 函 数 是 不 能 被 派 生 类 继 承 的 .
例题 6:设有基类定义:
class Cbase
{ private: int a;
protected: int b;
public: int c;
};
派生类采用何种继承方式可以使成员变量 b 成为自己的私有成员( )
public: int c3;
};
};
};
请按访问权限写出派生类 C 中具有的成员。
私有成员:
(1)
保护成员:
(2)
公有成员:
(3)

答案:(1)c1、b2、b3、A2、A3 (2)c2 (3)c3
分析:B类有它自己的私有成员 b1、保护成员 b2 和公有成员有 b3,另外B类是以保护方式
从A类中派生出来的,所以A类保护成员A2 和公有成员 A3 在B类中都变成保护类型的;
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
A. 私有继承
B.保护继承
C. 公有继承
D.私有、保护、公有均可
答案:A
分析:私有继承时,基类的 protected 成员在派生类中作为 private 成员。
例题 7:C++将类继承分为 (1) 和 (2) 两种。
答案:(1)单继承
(2)多继承
分析:派生类可以只从一个基类中派生,也可以从多个基类中派生。从一个基类中派生的继
A(int a=0) {x=a;}
void display() { cout<<"A.x="<<x<<endl; }
};
class B
{ public:
int x;
B(int a=0) {x=a;}
void display() {cout<<"B.x="<<x<<endl; }
};
class C:public A,public B
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;
{
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);
myc.x=10;
myc.display();
}
分析:类 A、B 中有同名公有数据成员 x 和同名成员函数 display(),在主函数中访问对象
C类有自己的私有成员 c1、保护成员 c2 和公有成员有 c3,C类是以私有方式从 B 类中派生
出来的,所以B类中的 b2、b3、A2 和 A3 在C类中都变成私有的访问方式。
例题 12:指出并改正下面程序中的错误。
#include<iostream.h>
class Point
{
int x,y;
public:
承方式称为单继承。从多个基类中派生的继承方式称为多继承。
例题 8:派生类可以定义其_______________中不具备的数据和操作。 答案:基类 分析:派生类是从基类派生的,派生类包含了它所有基类的除构造函数、析构函数之外的所 有成员,同时还拥有它自己的新成员。
例题 9:派生类构造函数的初始化列表中包含____________________________。 答案:初始化基类数据成员、新增内嵌对象数据及新增一般成员数据所需要的全部参数。
C.非虚基类的构造函数
D.派生类中子对象类的构造函数
答案:B
分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生
类中子对象类的构造函数, 派生类自己的构造函数。
例题 5: C++类体系中,能被派生类继承的是( )。
A.构造函数
B.虚函数 C.析构函数
D.友元函数
答案:B
也会自动继承间接基类的成员。
A)规律性
B.传递性
C.重复性
D.多
样性
答案:B
(3)下列对基类和派生类关系的描述中,错误的是(
)。
A.派生类是基类的具体化
B.派生类是基类的子集
C.派生类是基类定义的延续
D.派生类是基类的组合
答案:B
(4)下列对派生类的描述中,错误的是(
)。
A. 一个派生类可以作为另一个派生类的基类
B. 派生类至少有一个基类 C. 派生类的缺省继承方式是 private D. 派生类只含有基类的公有成员和保护成员
答案:D
(5)下列对继承的描述中,错误的是(
)。
A. 析构函数不能被继承
B. 派生类也是基类的组合
C. 派生类的成员除了它自己的成员外,还包含了它的基类的成员
D. 派生类中继承的基类成员的访问权限到派生类保持不变
例题 14:看程序写结果
#include <iostream.h>
class Base
{
int i;
public:
Base(int n){cout <<"Constucting base class" << endl;i=n;}
~Base(){cout <<"Destructing base class" << endl;}
例题 10:在继承机制下,当对象消亡时,编译系统先执行 (1) 的析构函数,然后才执
行 (2) 的析构函数,最后执行 (3) 的析构函数。
答案:(1)派生类
(2)派生类中子对象类
(3)基类
分析:派生类的析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调
用派生类中子对象类的析构函数,最后调用基类的析构函数。
Rectangle 的对象 r 不能直接访问基类的成员函数 move()、getx()和 gety()。其改正方法有两
种:1)将 Rectangle 的继承方式改为公有继承 public;2)在 Rectangle 类中重定义 move(),
getx()和 gety()函数,覆盖基类的同名函数。
void Rectangle::move(int xoffset,int yoffset){Point::move(xoffset,yoffset);}
答案:D 分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类 的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出 现同名函数时,不可能出现二义性。
Baidu Nhomakorabea
例题 4:多继承派生类构造函数构造对象时,( )被最先调用。
A.派生类自己的构造函数 B.虚基类的构造函数
9.3 教材习题分析与解答
1.选择题
( 1)C++ 中 的 类 有 两 种 用 法 :一 种 是 类 的 实 例 化 ,即 生 成 类 对 象 ,并 参 与 系 统 的 运 行 ;
另一种是通过()派生了新的类。
A. 复 用
B. 继 承
C. 封 装
D.
引用
答案:B
(2)继承具有(
),即当基类本身也是某一个类派生类时,底层的派生类
myc 的数据成员 x 是无法确定是访问从 A 中继承的还是从 B 中继承的 x;调用成员函数也
是如此,无法确认是调用类 A 中的还是类 B 中的,产生二义性。改正方法,可以用作用域
区分符加以限定,如改成 myc.A::x=10; myc.A::display();或 myc.B::x=10; myc.B::display();
相关文档
最新文档