文档库 最新最全的文档下载
当前位置:文档库 › 继承和派生测试题

继承和派生测试题

继承和派生测试题
继承和派生测试题

继承和派生练习

一单选题

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"<

};

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()

{

cout<<"a="<

int main(void) // 主函数main(void) { C obj; // 定义对象 system("PAUSE"); // 调用库函数system( ),输出系统提示信息return 0; // 返回值0, 返回操作系统 } 2.先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。// 文件名: main.cpp #include // 预处理命令 using namespace std; // 使用标准命名空间std class A { protected: // 数据成员: int a; // 数据成员 public: // 公有函数: A(int x): a(x){ } // 构造函数 void Show() const{ cout << a << endl; } // 显示a之值 }; class B { protected: // 数据成员: int b; // 数据成员 public: // 公有函数: B(int x): b(x){ } // 构造函数 void Show() const{ cout << b << endl; } // 显示a与b之值 }; class C: public A, public B { public: // 公有函数: C(int x, int y): A(x), B(y){ } // 构造函数 void Show() const // 显示b之值 { cout << a << "," << b << endl; } }; int main(void) // 主函数main(void) { C obj(5, 18); // 定义对象 obj.Show(); // 显示相关信息 obj.A::Show(); // 显示相关信息 obj.B::Show(); // 显示相关信息 system("PAUSE"); // 调用库函数system( ),输出系统提示信息return 0; // 返回值0, 返回操作系统 }

c++实验3 派生类与继承1

实验三派生类与继承 一、实验目的 1、学习类的继承,能够定义和使用类的继承关系。 2、学习派生类的声明与定义方法。 3、掌握类的定义和对象的声明。 4、熟悉公有派生和私有派生的访问特性。 5、掌握派生类构造函数和析构函数的执行顺序。 6、掌握利用访问声明调整基类成员在派生类中的访问属性。 二、试验内容 1、下面的程序可以输出ASCII字符与所对应的数字的对照表。修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<127;i++) { cout<

c=m; } void print(void); protected: char *c; }; void der_table::print(void) { cout< using namespace std; #include class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<=122;i++)

C++继承与派生类习题

第九章继承与派生类 9.2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有 成 的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。 例题4:多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数 B.虚基类的构造函数 C.非虚基类的构造函数D.派生类中子对象类的构造函数 答案:B 分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。

例题5:C++类体系中,能被派生类继承的是()。 A.构造函数B.虚函数C.析构函数D.友元函数答案:B 分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的. 例题6:设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 用派生类中子对象类的析构函数,最后调用基类的析构函数。 例题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; public: int c3; }; }; }; 请按访问权限写出派生类C中具有的成员。 私有成员: (1)

实验四 继承与派生讲解学习

实验四继承与派生

实验四派生类与继承 【实验类型】验证性实验【实验课时】2学时 【实验目的】 (1)理解类的继承的概念,能够定义和使用类的继承关系。 (2)掌握派生类的声明与定义方法。 (3)熟悉公有派生和私有派生的访问特性。 (4)学习虚基类在解决二义性问题中的作用。 【实验环境】 硬件:计算机 软件:Microsoft Visual C++ 6.0 【实验内容】 1、按要求阅读、编写、调试和运行以下程序。 (1)实验内容 ①定义一个基类MyArray,基类中可以存放一组整数。 class MyArray {public: MyArray(int leng); ~MyArray(); void Input(); void Display(); protected: long int *alist; // 指向动态申请的一组空间 int length;}; // 整数的个数 基类中有构造函数、析构函数、输入数据和输出数据的函数。 ②定义一个类SortArray继承自MyArray ,在该类中定义函数实现排序功能。

③定义一个类ReArray继承自MyArray ,在该类中定义函数实现逆转功能。 ④定义一个类AverArray继承自MyArray ,在该类中定义函数Aver求解整数的平均值。 ⑤定义NewArray类,同时继承了SortArray, ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转、和求平均值的功能。在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。 (2)实验程序 (参考) 程序如下: #include "iostream.h" #include "process.h" class MyArray {public: MyArray(int leng); ~MyArray(); void Input(); void Display(); protected: long int *alist; // 指向动态申请的一组空间 int length; // 整数的个数 }; MyArray::MyArray(int leng) { length=leng; alist=new long int[length]; if(alist==NULL) { cout<<"对不起,创建失败。请重试。 ";exit(1); } } MyArray::~MyArray() {

实验3 继承和派生类的应用

3.1实验目的 1.掌握多重继承和派生类的方法 2.掌握初始化基类成员的方法 3.掌握定义虚基类的方法 3.2实验内容与步骤 1.上机实验题一 定义一个日期(年、月、日)的类和一个时间(时、分、秒)的类,并由这两个类派生出日期和时间类。主函数完成基类和派生类的测试工作。 ⑴分析 定义一个描述日期的类,构造函数完成年、月、日的初始化,包含一个重新设置日期的成员函数,一个获取日期的成员函数。该类可定义为: class Date{ int Year,Month,Day; //分别存放年、月、日 public: Date(int y=0, int m=0,int d=0) { Year= y; Month = m; Day = d; } void SetDate(int ,int ,int ); void GetDate(char *); }; 函数SetDate完成数据成员的赋初值。函数GetDate要将整数年、月、日变换成字符串后,存放到参数所指向的字符串中。把一个整数变换成字符串可通过库函数: char * _itoa(int a , char *s, int b); 来实现,参数a为要变换的整数,b为数制的基数(如10,表示将a转换为对应的十进制的字符串),转换的结果存放到s所指向的字符串中。函数返回变换后字符串的首指针。该成员函数可以是: void Date::GetDate(char *s) { char t[20];

_itoa(Year,s,10); //将年变换为字符串表示 strcat(s,"/"); //年、月、日之间用“/”隔开 _itoa(Month,t,10); //将月变换为字符串表示 strcat(s,t); //将年、月字符串拼接 strcat(s,"/"); _itoa(Day,t,10); strcat(s,t); //将年、月、日拼接成一个字符串} 定义描述时间的类与描述日期的类类同,然后用这二个类作为基类,公有派生出描述日期和时间的类。 简化的参考程序如下: #include #include #include class Date{ int Year,Month,Day; //分别存放年、月、日 public: Date(int y=0, int m=0,int d=0) { Year= y; Month = m; Day = d; } void SetDate(int ,int ,int ); void GetDate(char *); }; void Date::SetDate(int y,int m,int d ) { Year= y; Month = m; Day = d; } void Date::GetDate(char *s) { char t[20]; _itoa(Year,s,10); strcat(s,"/"); _itoa(Month,t,10); strcat(s,t); strcat(s,"/"); _itoa(Day,t,10); strcat(s,t); } class Time { int Hours,Minutes,Seconds; //时、分、秒 public: Array Time(int h=0,int m=0, int s=0)

内蒙古科技大学面向对象的程序设计实验8 继承(一)

内蒙古科技大学 面向对象的程序设计 实验报告 一、实验目的 1.理解继承的含义以及声明; 2.理解共有派生、私有派生和保护派生的含义以及使用; 3.理解单派生类中构造函数和析构函数的调用顺序。 二、实验环境 编译器:Visual C++ 6.0. 操作系统:Windows 7 旗舰版 三、实验内容 2.1练习(一): 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include "iostream.h" class CBase { public: CBase(int a) :a(a) {

} protected: void print() { cout<<"a="<

类的继承与派生综合题

1. 类的继承与派生综合题1 题目描述 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类。 要求: a.在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员:销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员:经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其他数据成员。 b.各类人员的实发工资公式如下: 员工实发工资=基本工资+奖金*出勤率 销售员实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例 经理实发工资=基本工资+奖金*出勤率+总销售额*经理提成比例 销售经理实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例+总销售额*经理提成比例 c.每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。 主函数如下: int main() { Salemanobjsale(101101, "LD", 0.88f, 1200, 800, 0.05f, 10000); Manager objmana(101102, "NXG", 0.90f, 2500, 1000, 0.10f, 20000); SaleManagerobjsalemana(101103, "HDY", 0.99f, 3500, 2000, 0.20f, 100000, 0.20f,150000); objsale.Output(); cout<< "销售员的实发工资:" << " "; cout<

实验四 继承与派生

实验四继承与派生 一、实验目的: 掌握利用单继承和多重继承的方式定义派生类的方法; 深刻理解在各种继承方式下构造函数和析构函数的执行顺序; 理解和掌握公有继承,私有继承和保护继承对基类成员的访问机制; 理解虚基类的概念以及引入虚基类的目的和作用。 二、实验时间: 三、实验地点: 四、实验内容: 1.运行以下程序,并对运行结果进行分析 #include"stdafx.h" #include using namespace std; class base{ int n; public: base(int a) {cout<<"constructing base class"<

继承与派生(二)实验报告

学号:姓名:班级: 实验四继承与派生(二) 【实验目的】 1、理解多重继承的概念; 2、理解为了避免同同一基类出现多个重复的副本而采用的虚基类概念和虚拟继承; 3、学习利用虚基类解决二义性问题。 【实验内容】 题目: 2、设计一个用于人事管理的“people(人员)”基类。考虑到通用 性,仅只抽象出所有类型人员都有的属性:编号、姓名、性别、出生日期、身份证号等;从people(人员)类派生出student(学生)类,并添加属性:班号classNO;从people类派生出teacher(教师)类,并添加属性:职务principalship、部门Department;从student类派生出graduate (研究生)类,并添加属性:专业subject、导师teacher adviser(teacher 类);从graduate类和teacher类派生出TA(助教生)类。设计时注意虚基类的使用,注意重载相应的成员函数。测试这些类。

UML图: Date -year: int -month: int -day: int <>-Date(y: int, m: int, d: int) <>-Date(D: Date) +init(y: int, m: int, d: int): void +show(): void people #m_date: Date #m_no: long #m_ident_no: string #m_name: string #m_sex: string <>-people(no: long, name: string, sex: string, ident_no: string, year: int, month: int, day: int) <>-people(no: long, name: string, sex: string, ident_no: string, date: Date) <>-people(p: people) +init(no: long, name: string, sex: string, ident_no: string, year: int, month: int, day: int): void +init(no: long, name: string, sex: string, ident_no: string, date: Date): void +init(p: people): void +show(): void student #m_classno: string <>-student(person: people, classno: string) <>-student(stu: student) +show(): void teacher #m_principalship: string #m_department: string <>-teacher(p: people, principalship: string, department: string) <>-teacher(stu: teacher) +show(): void graduate #m_subject: string #m_adviser: teacher <>-graduate(s: student, subject: string, t: teacher) <>-graduate(g: graduate) +show(): void TA <>-TA(g: graduate, t: teacher) <>-TA(t: TA) +show(): void

相关文档
相关文档 最新文档