继承和派生练习
一单选题
1.下列虚基类的声明中,正确的是(D)。
A. class virtual B:public A
B. virtual class B:public A
C. class B:public A virtual
D. class B: virtual public A
2.C++类体系中,不能被派生类继承的有(A )。
A. 构造函数
B. 虚函数
C. 静态成员函数
D. 赋值操作函数
3.下列说法错误的是(D )。
A. 公有继承的基类中的public成员在派生类中仍是public的
B. 公有继承的基类中的private成员在派生类中仍是private的
C. 私有继承的基类中的public成员在派生类中变成private的
D. 保护继承的基类中的public成员在派生类中变成protected的
4.下列对继承的描述中,错误的是(B,D )。
A. 析构函数不能被继承
B. 派生类也是基类的组合
C. 派生类的成员除了它自己的成员外,还包含了它的基类的成员
D. 派生类中继承的基类成员的访问权限到派生类保持不变
5.下列对基类和派生类关系的描述中,错误的是(A )。
A. 派生类是基类的具体化
B. 派生类是基类的子集
C. 派生类是基类定义的延续
D. 派生类是基类的组合
6.C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过(B)派生了新的类。
A. 复用
B. 继承
C. 封装
D. 引用
7.C++类体系中,能被派生类继承的是(B )。
A. 构造函数
B. 虚函数
C. 析构函数
D. 友元函数
8.关于多继承二义性的描述,(D )是错误的。
A. 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性
B. 一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公
共基类的访问可能出现二义性
C. 解决二义性最常用的方法是作用域运算符对成员进行限定
D. 派生类和它的基类中出现同名函数时,将可能出现二义性
9.下列对派生类的描述中,(D )是错误的。
A. 一个派生类可以作为另一个派生类的基类
B. 派生类至少有一个基类
C. 派生类的成员除了它自己的成员外,还包含了它的基类成员
D. 派生类中继承的基类成员的访问权限到派生类保持不变
10.若类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 )是非法的表达式。
A. k=i*j
B. int k;
C. return i;
D. void make();
11.关于公有继承,下列说法错误的是(B )。
A. 基类的公有成员和保护成员被继承后作为派生类的公有成员和保护成员。
B. 派生类的其他成员可以直接访问基类的公有成员和保护成员。
C. 派生类的对象可以访问基类的私有成员。
D. 派生类成员和对象都无法访问基类的私有成员。
12.下列说法中错误的是(D )。
A. 公有继承时基类中的public成员在派生类中仍是public的;
B. 公有继承时基类中的private成员在派生类中仍是private的;
C. 私有继承时基类中的public成员在派生类中是private的;
D. 保护继承时基类中的public成员在派生类中是protected的;
13.在公有继承中,基类中的公有成员作为派生类的(A )。
A. 公有成员
B. 私有成员
C. 保护成员
D. 私有成员函数
14.基类中的(C )不允许外界访问,但允许派生类的成员访问,这样既有一
定的隐藏能力,又提供了开放的接口。
A. 公有成员
B. 私有成员
C. 保护成员
D. 私有成员函数
15.在下面的表达式中,不表示虚继承的是(C )。
A. virtual public
B. public virtual
C. public
D. virtual
16.设置虚函数的声明中,正确的是(B )。
A. 简化程序
B. 消除二义性
C. 提高运行效率
D. 减少目标代码
17.下面叙述错误的是(D)。
A. 基类的protected成员在派生类中仍然是protected
B. 基类的protected成员在public派生类中仍然是protected的
C. 基类的protected成员在private派生类中是private的
D. 基类的protected成员不能被派生类的对象访问
18.派生类的对象对它的基类成员中(AC )是可以访问的。
A. 公有继承的公有成员
B. 公有继承的私有成员
C. 公有继承的保护成员
D. 私有继承的公有成员
19.下列对派生类的描述中,错误的是(D)。
A. 一个派生类可以作为另一个派生类的基类
B. 派生类至少有一个基类
C. 派生类的缺省继承方式是private
D. 派生类只含有基类的公有成员和保护成员
20.继承具有(B ),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A. 规律性
B. 传递性
C. 重复性
D. 多样性
填空题
1. 在继承机制下,当对象消亡时,编译系统先执行( 派生类的) 的析构函数,然后才执行(子对象的)的析构函数,最后执行(基类的)
的析构函数。
2. 派生类构造函数的初始化列表中包含( 基类的构造函数)。
3. 派生类可以定义其(基类)中不具备的数据和操作。
4. C++将类继承分为(单一继承)和(多重继承)两种。
问答题
1. 写出下列程序运行结果:
#include
using namespace std;
class A
{
int x;
public:
int z;
void setx(int i){x=i;}
int getx(){return x;}
};
class B: public A
{
int m;
public:
void setvalue(int a,int b,int c)
{
setx(c);
z=b;
m=a;
}
void display()
{
cout< } }; int main() { B obj; obj.setvalue(2,3,4); obj.display(); return 0; } 运行结果:4,3,2 2. 写出程序运行结果: #include using namespace std; class base { public: void who(){cout<<"base class"< class derive1:public base { public: void who(){cout<<"derive1 class"< class derive2:public base { public: void who(){cout<<"derive2 class"< void main() { base obj1; obj1.who(); derive1 obj2; obj2.base::who(); derive2 obj3; obj3.base::who(); } 运行结果:base class base class base class 3. 阅读下列程序,写出程序运行结果。#include using namespace std; class Base { int x; public: Base(int i) { x=i; cout<<"Constuctor of Base"< } ~Base(){cout<<"Destuctor of Base"< class Derived:public Base { Base d; public: Derived(int i):Base(i),d(i){cout<<"Constuctor of Derived"< }; int main() { Derived obj(5); obj.show(); return 0; } 运行结果:Destuctor of Base Destuctor of Base Constuctor of Derived X=5 Destuctor of Base Destuctor of Base Destuctor of Derived 4. 阅读下列程序,写出程序运行结果。 #include using namespace std; class Person { public: Person(){cout<<"Constructor of Person"< ~Person(){cout<<"Destructor of Person"< }; class Student:public Person { public: Student(){cout<<"Constructor of Student"< ~Student(){cout<<"Destructor of Student"< }; class Teacher:public Person { public: Teacher(){cout<<"Constructor of Teacher"< ~Teacher(){cout<<"Destructor of Teacher"< }; int main() { Student s; Teacher t; return 0; } 5. 阅读下列程序,写出程序运行结果。#include using namespace std; class data { public: int x; data(int n) { x=n; cout<<"data"< } ~data(){cout<<"data"< }; class A { data d1; public: A(int x):d1(x){ cout<<"A"< void dispa() { cout< } ~A(){ cout<<"A"< }; class B:public A { data d2; public: B(int x):A(x-1),d2(x){ cout<<"B"< void dispb() { dispa(); cout< }; int main() { B obj(5); obj.dispb(); return 0; } 6. 阅读下列程序,写出程序运行结果。 #include using namespace std; class A { protected: int x,y; public: A() { x=3,y=4; cout << "A() Constructor!" << endl; } A(int m,int n) { x=m,y=n; cout << "A(int m,int n) Constructor!" << endl; } ~A(){cout << "A Destructor!" << endl;} }; class B : public A { protected: int i,j; public: B(int a,int b):A(a,b) { i=3,j=4; cout << "B(int a,int b) Constructor!" << endl; } { i=a,j=b; cout << "B(int a,int b,int m,int n) Constructor!" << endl; } ~B(){cout << "B Destructor!" << endl;} void print() { cout< } }; int main() { B d(1,2); d.print(); return 0; } 7. 阅读下列程序,写出程序运行结果。 #include using namespace std; class A { protected: int x,y; public: A(int m=5,int n=6) { x=m,y=n; } }; class B : public A { protected: int i,j; public: B(int a,int b) { i=a,j=b; } { i=a,j=b; } void print() { cout< }; int main() { B d(1,2); d.print(); B c(1,2,3,4); c.print(); return 0; } 8. 阅读下列程序,写出程序运行结果。#include using namespace std; class A { public: A(int i,int j ) { a=i; b=j; } void move(int x,int y) { a+=x; b+=y; } void show( ){cout< int a,b; }; class B:public A { public: B(int i,int j):A(i,j){} void fun() { move(3,5); } }; int main( ) { B d(3,4); d.fun(); d.show(); return 0; } 9. 阅读下列程序,写出程序运行结果。 #include using namespace std; class BaseClass { public: BaseClass() { cout << "BaseClass Constructor!" << endl;} ~BaseClass() { cout << "BaseClass Destructor!" << endl;} }; class DerivedClass : public BaseClass { public: DerivedClass() {cout << "DerivedClass Constructor!" << endl;} ~DerivedClass() {cout << "DerivedClass Destructor!" << endl;} }; int main() { DerivedClass d; return 0; } 10. 写出下列程序运行结果: #include using namespace std; class B0 { public: void display(){cout<<"B0::display()"< }; class B1: public B0 { public: void display(){cout<<"B1::display()"< }; class D1: public B1 { public: void display(){cout<<"D1::display()"< }; int main() { B0 b0; B1 b1; D1 d1; B0 *p; p=&b0; p->display(); p=&b1; p->display(); p=&d1; p->display(); } 11. 写出程序运行结果: #include using namespace std; class Base { int x; public: Base(int xx=0):x(xx){cout<<"Constuctor of Base"< void Print(){cout< int GetX(){return x;} }; class Derived:public Base { int y; Base z; public: Derived(int xx=0,int yy=0):Base(xx),y(yy),z(xx+yy) {cout<<"Constuctor of Derived"< ~Derived(){cout<<"Destuctor of Derived"< { Base::Print(); cout< } }; int main() { Derived obj1(2); obj1.Print(); return 0; } 12. 写出程序运行结果: #include using namespace std; class AA { int a; public: AA() { cout<<"Initializing AA!\n"; } ~AA() { cout<<"Destroying AA!\n";} }; class BB { int b; AA p; public: BB() { cout<<"Initializing BB!\n"; } ~BB() { cout<<"Destroying BB!\n";} }; void main() { BB X; cout<<"Ending main!\n"; } 13. 写出程序运行结果: #include using namespace std; class A { public: A() { cout << "Constructor A" << endl;} ~A() { cout << "Destructor A" << endl;} }; class B : public A { public: B() {cout << "Constructor B" << endl;} ~B() {cout << "Destructor B" << endl;} }; class C : public B { public: C() {cout << "Constructor C" << endl;} ~C() {cout << "Destructor C" << endl;} }; int main() { C c1; return 0; } 14. 写出程序运行结果: #include using namespace std; class A { public: A(){a=0;b=0;} A(int i){a=i;b=0;} A(int i,int j){a=i;b=j;} void display() {