D、派生类是基类的子类型;
三、改错题(程序的每一行前加上了行号,可以通过说明行号来指出错误位置)(共20分)。 1、指出下面程序中的错误并改正。
Line1: class MyClass
Line2: {
Line3: public:
Line4: MyClass(int i) {member=i;}
Line5: void SetMember(int m) {member=m;} Line6: int GetMember() const {return member;} Line7: private:
Line8: int member; Line9: };
Line10: void main()
Line11: {
Line12: MyClass obj1; Line13: MyClass obj2(3); Line14: obj1.member=5;
Line15: MyClass.SetMember(10); Line16: }
2、指出下面程序中的错误,并说明错误原因。
Line1: class A Line2: {
Line3: public:
Line4: A() {func();}
Line5: virtual void func()=0;
Line6: };
3、指出下面程序中的错误,说明错误原因并改正。
Line1: class Test
Line2: {
Line3: public:
Line4: Test(int i) Line5: {
Line6: ptr=new int(i); Line7: }
Line8: ~Test()
Line9: {
Line10: delete ptr; Line11: }
Line12: private:
Line13: int *ptr; Line14: };
Line15: void main()
Line16: {
Line17: Test obj1(1);
Line18: Test obj2(obj1); Line19: }
四、简答题(共30分)。
1、在下面给定的继承结构中,回答下列提出的问题。
class One {
public:
int a;
void b();
void c(float); };
class Two {
public: void b(); void c(); private: int a; };
class Three : public One,public Two {
public:
void b(); };
void main() {
Three obj;
obj.a=1; ----------------S1 obj.b(); ----------------S2 obj.c(10); ----------------S3 }
(1)、什么是多继承中的支配原则?
(2)、主函数中对各条语句(S1, S2, S3)的访问是否具有二义性?为什么? 2、写出下面程序的输出结果。
#include
if(y==0)
throw y; return x/y; }
void main() {
try
{
cout<<\ cout<<\ cout<<\ }
catch(int) {
cout<<\
}
cout<<\}
3、写出下面程序的输出结果。 #include
public:
A(char i) {cout<<\ ~A() {cout<<\};
class B : virtual public A {
public:
B(char i,char j) : A(i) {cout<<\ ~B() {cout<<\private: char b; };
class C : virtual public A {
public:
C(char i,char j) : A(i) {cout<<\ ~C() {cout<<\};
class D : public B,public C {
public:
D(char i,char j,char k,char l,char m,char n) : C(k,l), B(i,j),A(i),aa(m) {cout<<\ ~D() {cout<<\private: A aa; };
void main() {
D obj('a','b','c','d','e','f');
}
五、根据给定的程序执行结果,将下列程序补充完整。(10分)。
#include
public:
Base(int i) {b=i;} (1) protected: int b;
};
class Derive1:public Base {
public:
(2) void Print() {
cout<<\ } };
class Derive2:public Base {
(3) };
void fun( (4) ) {
obj->Print(); }
void main() {
(5) fun(d1); fun(d2); }
程序的执行结果如下:
Derive1's Print() called. Derive2's Print() called.
模拟试题三
一、填空题(每空1分,共20分)。
1、所有的面向对象程序设计语言,都支持三个共同的本质特征 、 、 。
2、为了解决程序中函数调用的效率问题,引入了 ,定义时需在函数前面加上 说明;为了提高程序
的运行效率,引入了 ,定义时需在函数前面加上 说明。 3、在类的定义当中,缺省的成员是 成员。 4、请填写下列表格(填写派生类中成员的类型)。
public 派生类继承方式 基类中成员类型 public private protected 不可见 不可见 不可见 private protected 5、利用成员函数对二元运算符进行重载时,其左操作数为 ,右操作数为 。 6、设置虚基类的目的是 ,可通过 标识虚基类。
7、动态联编是在 的支持下实现的,它通过 来调用该函数操作。 二、选择题(每题2分,共20分)。
1、下列关于类型转换的描述中,( )是错误的。
A、在不同类型操作数组成的表达式中,其表达式类型一定是最高类型double型; B、逗号表达式的类型是最后一个表达式的类型;
C、赋值表达式的类型是左值的类型; D、由低向高的类型转换是保值映射。 2、( )不是构造函数的特征。 A、构造函数的函数名与类名相同;
B、构造函数可以重载;
C、构造函数可以设置缺省参数; D、构造函数必须指定类型说明。
3、在C++中,关于下列设置参数默认值的描述中,( )是正确的。 A、不允许设置参数的默认值;
B、设置参数默认值只能在定义函数时设置;
C、设置参数默认值时,应该是先设置右边的,再设置左边的; D、设置参数默认值时,应该全部参数都设置。 4、关于new运算符的下列描述中,( )是错误的。
A、它可以用来动态创建对象和对象数组;
B、使用它创建的对象或对象数组可以使用运算符delete删除; C、使用它创建对象时要调用构造函数;
D、使用它创建对象数组时必须指定初始值。
5、重载函数在调用时选择的依据中,( )是错误的。 A、参数个数; B、参数的类型; C、函数名字; D、函数的类型。
6、下列描述中,( )是抽象类的特性。 A、可以说明虚函数; B、可以进行构造函数重载; C、可以定义友元函数; D、不能说明其对象。
7、( )是析构函数的特征。 A、一个类中只能定义一个析构函数;
B、析构函数名与类名不同;
C、析构函数的定义只能在类体内; D、析构函数可以有一个或多个参数;
8、关于delete运算符的下列描述中,( )是错误的。 A、它必须用于new返回的指针; B、它也适用于空指针;
C、对一个指针可以使用多次该运算符;
D、指针名前只有一对方括号符,不管所删除数组的维数。 9、const int *p说明不能修改( )。 A、p指针;
B、p指针指向的变量; C、p指针指向的数据类型; D、上述A、B、C三者。
10、关于子类型的描述中,( )是错误的。 A、子类型就是指派生类是基类的子类型;
B、一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型; C、在公有继承下,派生类是基类的子类型; D、子类型关系是不可逆的。 三、改错题(共15分)。