Spades-7 Clubs-5 Clubs-12 Hearts-11 Clubs-10 Hearts-8 Clubs-7 Clubs-8 The Second deal:
Clubs-12 Hearts-7 Diamonds-1 Hearts-6 Spades-2 Diamonds-13 Diamonds-2 Clubs-1 Spades-3 Spades-9 Diamonds-8 Diamonds-7 Clubs-3 Spades-12 Spades-8 Spades-6 Spades-4 Clubs-7 Hearts-13 Clubs-6 Clubs-11 Hearts-5 Spades-11 Clubs-4 Diamonds-5 Diamonds-9 Clubs-9 Clubs-5 Hearts-1 Diamonds-4 Diamonds-10 Hearts-10 Hearts-8 Spades-10 Clubs-10 Spades-13 Clubs-2 Diamonds-11 Diamonds-12 Clubs-8 Spades-7 Hearts-4 Spades-1 Hearts-2 Hearts-3 Hearts-9 Hearts-11 Diamonds-6 Clubs-13 Spades-5 Hearts-12 Diamonds-3 习题8参考答案
8.1 选择填空:(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.与虚基类下面的派生类个数有关. 答案:(1)C (2)D (3) C (4)B (5)A 8.2 分析程序的运行结果:(1) #include
26
public: void f1( ){move(3,5);} A(int x,int y){a=x;b=y;} void f2( ){A::print( );} void move(int xx,int yy){ a+=xx ; b+=yy ;} }; void void main() print( ){cout<<”(“< { class X cout<<\{ f(); public: } void f(){cout<<\void main() }; { class Y: public X X a; { Y b; public: a.f(); void f(){cout<<\ b.f(); void g(); b.g(); }; } void Y::g()
程序输出:xxxxxxx yyyyyyy ggggggg yyyyyyy (3)
#include
char *name; int age; int length; public: public: de_string (char *str, int age): string(str)
string ( char *str ) { de_string::age=age; } { void show () length=strlen(str); { name=new char[length +1]; string::show(); strcpy (name,str); cout<<\ } }
27
}; ptr1->show(); void main() ptr1 =&s2 ; { ptr1->show(); string s1 (\ ptr2=&s2; de_string s2(\ ptr2->show(); ptr1 =&s1; }
程序输出:Smith Jean Jean
the age is: 2
分析:公有继承下的赋值兼容规则:指向基类的指针可以用来指向派生类的对象。
用指向基类的指针访问派生类对象时,只能访问到派生类对象从基类中继承到的成员,面访问不到派生类新增添的成员。这种限制既对数据成员成立,也对函数成员成立。 第一个ptr1->show();输出Smith 第二个ptr1->show();输出Jean
然后,ptr2->show();输出Jean和2
9.3 分析下列程序的运行结果,指出派生类中area()函数重载的不同功能:#include
return if sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p((s1!=0)&&(s2!=0)&&(s3!=0)&&(s1+s2>s3)) 2.y)); { } s=(s1+s2+s3)/2; class circle: public Point return { sqrt(s*(s-s1)*(s-s2)*(s-s3)); int r; } public: else return 0; circle(int rad, int a, int b):Point(a,b) {r=rad;} } double area(){return 3.1416*r*r;} }; }; void main() class triangle:public Point { { circle c1(2, 3, 4), c2(5, 0, 0);
28
triangle t1(-4, 0, 4, 0, 0, 3); cout< 程序输出:12.5664 78.54 12 8.4上机实验题:定义一个大学生类student,函数私有数据成员:姓名、学号、校名,并为它定义带参数的构造函数、参数带缺省值的构造函数和输出数据成员值的print()公有成员函数,另定义研究生类,它以公有继承方式派生于类student,新增加“研究方向、导师名”两个私有数据成员,并定义带参数的构造函数和输出研究生数据的print()公有成员函数。在main()函数中定义基类和派生类对象,对类进行测试。 char *directorname; 解:#include #include 29 r\} gstu.print(); 程序运行输出结果如下: name=Li StuNum=1600240 StuNum=1600141 universty_name=XJU universty_name=XJU special is Compute name=Wang director is Zhang 8.5 上机实验题:建立普通的基类building,用于存储一座楼房的层数、房间数和它的总平方面积。建立有派生类house,继承building,并存储卧室和浴室的数量。另建立派生类office,继承building,存储工作人员和电话的数目。设计程序,并测试上述三个类。 参考程序: #include 30