第7章習題答案_第1頁
第7章習題答案_第2頁
第7章習題答案_第3頁
第7章習題答案_第4頁
第7章習題答案_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第七章 派生與繼承1.單選題(1)下列關于繼承的描述中,錯誤的是( B )。A繼承是重用性的重要機制BC+語言支持單重繼承和雙重繼承C繼承關系不是可逆的D繼承是面向對象程序設計語言的重要特性(2)下列關于基類和派生類的描述中,錯誤的是( C )。A一個基類可以生成多個派生類B基類中所有成員都是它的派生類的成員C基類中成員訪問權限繼承到派生類中不變D派生類中除了繼承的基類成員還有自己的成員(3)下列關于派生類的描述中,錯誤的是( D )。A派生類至少有一個基類B一個派生類可以作另一個派生類的基類C派生類的構造函數中應包含直接基類的構造函數D派生類默認的繼承方式是public(4)派生類的對象可以

2、直接訪問的基類成員是( A )。A公有繼承的公有成員B保護繼承的公有成員C私有繼承的公有成員D公有繼承的保護成員(5)下列描述中,錯誤的是( D )。A基類的protected成員在public派生類中仍然是protected成員B基類的private成員在public派生類中是不可訪問的C基類public成員在private派生類中是private成員D基類public成員在protected派生類中仍是public成員(6)派生類構造函數的成員初始化列表中,不能包含的初始化項是( B )。A基類的構造函數B基類的子對象C派生類的子對象D派生類自身的數據成員(7)下列關于子類型的描述中,錯誤

3、的是( B )。A在公有繼承下,派生類是基類的子類型B如果類A是類B的子類型,則類B也是類A的子類型C如果類A是類B的子類型,則類A的對象就是類B的對象D在公有繼承下,派生類對象可以初始化基類的對象引用(8)下列關于多繼承二義性的描述中,錯誤的是( D )。A一個派生類的多個基類中出現了同名成員時,派生類對同名成員的訪問可能出現二義性B一個派生類有多個基類,而這些基類又有一個共同的基類,派生類訪問公共基類成員時,可能出現二義性C解決二義性的方法是采用類名限定D基類和派生類中同時出現同名成員時,會產生二義性2多重繼承與單一繼承的區別是什么?答:派生類只有一個基類的稱為單一繼承。單一繼承的定義格式

4、為:class<派生類名>:<繼承方式><基類名> 派生類中新成員定義派生類有兩個或兩個以上的基類稱為多重繼承。多重繼承的定義格式為:class<派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,<繼承方式n><基類名n> 派生類中新成員定義3繼承有哪三種繼承方式,各自有何特點?答:繼承方式主要表示派生類繼承基類時采用的繼承方式,主要有三種,即公有繼承、私有繼承和保護繼承。(1)公有繼承(public)。公有繼承的特點是基類的公有成員和保護成員作為派生類的成

5、員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的。(2)私有繼承(private)私有繼承的特點是基類的公有成員和保護成員作為派生類的私有成員,并且不能被這個派生類的子類訪問。(3)保護繼承(protected)保護繼承的特點是基類的所有公有成員和保護成員都成為派生類的保護成員,并且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。4.在定義派生類的過程中,如何對基類的數據成員進行初始化?答: 由于基類在派生類中通常是隱藏的,所以依序通過調用基類的構造函數來設定基類的數據成員的初值。它的格式為<派生類名>(形參表):基類1(參數表),基類2(參數表)對象成員1

6、(參數表),對象成員2(參數表)5.什么是賦值兼容規則?賦值兼容規則的實質是什么?試舉例說明。答:賦值兼容規則是指,對于共有派生類來說,可以將派生類的對象賦值給其基類。它實質上就是基類對象的內存空間和派生類對象中基類拷貝的內存空間引用的兼容。6.什么是虛基類?它的作用是什么?答:虛基類不是指基類是虛的,而是指在派生類中指定的基類是虛繼承的方式。使用虛基類的目的是在多重派生中使用共有基類在派生類中只有一個拷貝從而解決有多個基類拷貝所產生的二義性問題。7. 分析下列程序的運行結果。#include<iostream.h>class Aprivate: int a; public:A(i

7、nt i=0) a=i; void show()cout<<"a="<<a<<endl;class B private:int b; public:B(int i=0)b=i;void show() cout<<"b="<<b<<endl;class C:public A,public Bprivate: int c; public: C(int i=0,int j=0,int k=0):A(i),B(j) c=k; void show() A:show(); B:show(); c

8、out<<"c="<<c<<endl;void main() B b(12); b.show(); C c1,c2(30,40),c3(70,80,90); c1.show(); c2.show(); c3.show(); c2.B:show();答:程序運行結果:b=12a=0b=0c=0a=30b=40c=0a=70b=80c=90b=40分析:(1)本程序是多重繼承的程序,類C繼承了類A和類B的數據成員。(2)在主程序中,分別對類C的對象c1、c2、c3賦不同的值,則對類A和類B數據成員的賦值也不一樣。8. 分析下列程序的運行結果。

9、#include<iostream.h>class Base1 public : Base1( int i ) cout << "調用基類Base1的構造函數:" << i << endl ; ;class Base2 public: Base2( int j ) cout << "調用基類Base2的構造函數:" << j << endl ; ; class A : public Base1, public Base2 public : A( int a, int b,

10、 int c, int d ) : Base2(b), Base1(c), b2(a), b1(d) cout << "調用派生類A的構造函數:" << a+b+c+d << endl; private : Base1 b1 ; Base2 b2 ; ; int main() A obj( 1, 2, 3, 4 ); 答:調用基類BASE1的構造函數:3調用基類BASE2的構造函數:2調用基類BASE1的構造函數:4調用基類BASE2構造函數:1調用派生類A的構造函數:109. 分析下列程序的運行結果。#include<iostre

11、am.h>class A public : A(const char *s) cout << s << endl ; A();class B : virtual public A public : B(const char *s1, const char *s2) : A( s1 ) cout << s2 << endl ; ;class C : virtual public A public : C(const char *s1, const char *s2):A(s1) cout << s2 << endl ;

12、 ;class D : public B, public C public : D( const char *s1, const char *s2, const char *s3, const char *s4 ) : B( s1, s2 ), C( s1, s3 ), A( s1 ) cout << s4 << endl ; ;int main() D *ptr = new D( "class A", "class B", "class C", "class D" ) ; delete p

13、tr;答:class Aclass Bclass Cclass D10. 有人定義一個教師類派生一個學生類。他認為“姓名”和“性別”是教師、學生共有的屬性,聲明為public,“職稱”和“工資”是教師特有的,聲明為private。在學生類中定義特有的屬性“班級”和“成績”。所以有class teacher public :char name20; char sex;/ Private :char title20; double salary; class student : public teacher /private : char grade20 ; int score;你認為這樣定義合適

14、嗎?請做出你認為合理的類結構定義。答:不合適,這樣導致數據冗余。合理的結構是提取它們共有的數據和操作定義一個基類,然后分別定義teacher和student作為派生類。class person protected:char name20; char sex;/;class teacher : public teache / private:char title20; double salary; class student : public teacher /private : char grade20 ; int score;11. 定義一個描述坐標位置的類location,從locatio

15、n派生出正方形類square,在正方形類中將location類作為正方形的起始點,并求正方形的周長和面積。答:#include<iostream.h>class locationprotected: int x,y; public:location(int a=0,int b=0) x=a;y=b;class square:public location private:int len;int girth;int area; public: square(int x,int y,int t):location(x,y) len=t; void set(); void show();

16、void square :set() girth=4*len; area=len*len;void square :show() cout<<"正方形的坐標點為:"<<x<<","<<y<<endl; cout<<"正方形的周長為:"<<girth<<endl; cout<<"正方形的面積為:"<<area<<endl;void main() square m(10,10,5); m.

17、set(); m.show(); 12. 把定義平面直角坐標系上的一個點的類Point作為基類,派生出描述一條直線的類Line,再派生出一個矩形類Rect。要求成員函數能求出兩點間的距離,矩形的周長和面積等。設計一個測試程序,并構造完整的程序。答:#include<iostream>#include<cmath>using namespace std;class Pointpublic:Point(int x=0,int y=0)this->x=x;this->y=y;public :int x,y;class Line:public Pointpublic

18、:Line(int x1=0,int y1=0,int x2=0,int y2=0):a(x1,y1),b(x2,y2)double Length()int s= a.x-b.x;int t= a.y-b.y;return sqrt(s*s+t*t);private:Point a,b;class Rect:public Linepublic: Rect(int x1,int y1,int x2,int y2 ):l1(x1,y1,x1,y2),l2(x1,y1,x2,y1)/x1,y1是矩形左下角的坐標,x2,y2是矩形右上角的坐標double SumLength ()/cout<&l

19、t;"矩形的周長是"<<<<endl;return (l1.Length()+l2.Length()*2;double square ()/cout<<"矩形的周長是"<<<<endl;return l1.Length()*l2.Length();private:Line l1,l2;void main()Line line(0,0,10,0);cout<<"這條線段的長度為:"<<line.Length ();Rect rect(0,0,10,10)

20、; cout<<"矩形的周長是"<<rect.SumLength()<<endl;cout<<"矩形的周長是"<<rect.square ()<<endl;13. 假設某銷售公司有銷售經理和銷售員工,月工資的計算辦法是:銷售經理的固定月薪為8000元并提取銷售額的5/1000作為工資;銷售員工只提取銷售額的5/1000作為工資。編一程序,定義一個基類Employee,它包含三個數據成員number、name和salary,以及用于輸入編號和姓名的構造函數。由Employee類派生Sa

21、lesman類,再由Salesman類派生Salesmanager類。Salesman類包含兩個新數據成員 commrate和sales,還包含用于輸入銷售額并計算銷售員工工資的成員函數pay和用于輸出的成員函數print。Salesmanager類包含新數據成員 monthlypay,以及用于輸入銷售額并計算銷售經理工資的成員函數pay、用于輸出的成員函數print()。在main函數中,測試你的類結構,求若干個不同員工的工資。答:#include <iostream>using namespace std;class employee public: employee() co

22、ut << "編號:" cin >> number; cout <<"姓名:" cin >> name; salary = 0;protected: char number5; char name10; double salary; ;class salesman: public employee public:salesman() commrate = 0.005; void pay() cout<<name<<"本月銷售額:" ; cin >> s

23、ales; salary = sales*commrate;void print() cout<<"銷售員 :"<<name<<"編號:"<<number<<"本月工資:"<<salary<<endl; protected:double commrate;double sales; ;class salesmanager: public salesman public: salesmanager() monthlypay = 8000; commrat

24、e = 0.005; void pay() cout<<name<<"本月部門銷售額:" ; cin >> sales; salary = monthlypay + sales*commrate; void print() cout<<"銷售經理 :"<<name<<"編號:"<<number<<"本月工資:"<<salary<<endl; private: double monthlypay;i

25、nt main() salesman obj1; obj1.pay(); obj1.print(); salesmanager obj2; obj2.pay(); obj2.print();14. 編寫一個程序實現那一個班級學生的學期成績管理。個人信息類Person的數據成員有:姓名,年齡,性別;課程類Course的數據成員有:課程名,學分,成績;學生類Student從Person類派生,并增加數據成員:學號,Course對象數據成員數組(大小為8),總成績,總學分和平均成績;班級類Class類的數據成員有:Student類對象成員數組(大小由構造函數確定),班號,班級人數等。要求:(1)本班

26、級Class類的對象成員數組需要在構造函數中用new動態分配內存空間,在析構函數中釋放。在類Class中添加成員函數Seek,通過學號查找并輸出該學生的全部信息。(2)構造三個學生的數據,每個學生都有三門課程的成績,輸入并顯示這些數據。(3)根據類的需要添加適當的其他成員,編寫完整的程序并測試。答:#include<iostream.h>#include<cstring.h>class Personpublic:Person(char *name ,int age,char sex='M')strncpy(this->name,name ,20);

27、this->age=age ;this->sex=sex;void show()cout<<"學生的名字是:"<<name<<endl;cout<<"學生的年齡是:"<<age<<endl;cout<<"學生的性別是:"<<sex<<endl;private :char name20;int age;char sex;class Coursepublic:Course()cout<<"請輸入課程

28、名,學分和分數"<<endl;cin>>coursename>>credit>>score;public:char coursename20;float score;float credit;class Student:Personpublic:Student(char *name="NULL",int age=0,char sex='M',char *no="0"):Person(name,age,sex),Course()strncpy(this->no,no,20);double Mscoresum()scoresum=0;for(int i=0;i<2;i+)scoresum+=Couri.score;return scoresum;double Mcreditsum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論