c++繼承與派生習題答案 - 下載本文

1.概念填空題

1.1在C++中,三種派生方式的說明符號為 public 、 private 、 protected不加說明,則默認的派生方式為private 。 1.2當公有派生時,基類的公有成員成為派生類的 公有成員 ;保護成員成為派生類的 保護成員 ;私有成員成為派生類的 不能直接訪問成員 。當保護派生時,基類的公有成員成為派生類的 保護成員;保護成員成為派生類的 保護成員 ;私有成員成為派生類的 不能直接訪問成員 。

1.3 派生類的構造函數一般有3項工作要完成:首先 基類初始化 ,其次 成員對象初始化,最后 執行派生類構造函數體 。

1.4多繼承時,多個基類中的同名的成員在派生類中由于標識符不唯一而出現 二義性 。在派生類中采用 虛基類 或 作用域分辨符 來消除該問題。

2.簡答題

2.1 派生類如何實現對基類私有成員的訪問? 2.2什么是類型兼容規則?

2.3派生類的構造函數是怎樣的執行順序,析構函數的執行順序是如何實現的? 2.4繼承與組合之間的區別與聯系是什么?

2.5什么是虛基類?它有什么作用?含有虛基類的派生類的構造函數有什么要求,什么是最遠派生類,建立一個含有虛基類的派生類的對象時,為什么由最遠派生類的構造函數負責虛基類的初始化?

3.選擇題

3.1下面對派生類的描述中,錯誤的是(D )。

A.一個派生類可以作為另外一個派生類的基類 B.派生類至少有一個基類

C.派生類的成員除了它自己的成員外,還包含了它的基類的成員 D.派生類中繼承的基類成員的訪問權限到派生類中保持不變 3.2下列對友元關系敘述正確的是(A)。 A.不能繼承

B.是類與類的關系

C.是一個類的成員函數與另一個類的關系 D.提高程序的運行效率

3.3當保護繼承時,基類的(B)在派生類中成為保護成員,不能通過派生類的對象來直接訪問。

A.任何成員 B.公有成員和保護成員 C.公有成員和私有成員 D.私有成員 3.4設置虛基類的目的是(B)。

A.簡化程序 B.消除二義性

C.提高運行效率 D.減少目標代碼

3.5在公有派生情況下,有關派生類對象和基類對象的關系,不正確的敘述是( C )。 A.派生類的對象可以賦給基類的對象 B.派生類的對象可以初始化基類的引用

C.派生類的對象可以直接訪問基類中的成員

D.派生類的對象的地址可以賦給指向基類的指針

3.6有如下類定義: class MyBASE{ int k; public: void set(int n) {k=n;} int get( ) const {return k;} };

class MyDERIVED: protected MyBASE{ protected; int j; public: void set(int m,int n){MyBASE::set(m);j=n;} int get( ) const{return MyBASE::get( )+j;} };

則類MyDERIVED中保護成員個數是(B)。

A.4 B.3 C.2 D.1 3.7程序如下: #include using namespace std; class A { public: A( ) {cout<<”A”;} };

class B {public:B( ) {cout<<”B”;} }; class C: public A{ B b; public: C( ) {cout<<”C”;} };

int main( ) {C obj; return 0;} 執行后的輸出結果是(D)。 A.CBA B.BAC C.ACB D.ABC 3.8類O定義了私有函數F1。P和Q為O的派生類,定義為class P: protected O{…}; class Q: public O{…}。(C)可以訪問Fl。

A. O的對象 B. P類內 C. O類內 D. Q類內

3.9有如下類定義: class XA{ int x; public: XA(int n) {x=n;} };

class XB: public XA{ int y; public:

XB(int a,int b); };

在構造函數XB的下列定義中,正確的是(B)。 A.XB::XB(int a,int b):x(a),y(b){ } B.XB::XB(int a,int b):XA(a),y(b) { } C.XB::XB(int a,int b):x(a),XB(b){ } D.XB::XB(int a,int b):XA(a),XB(b){ } 3.10有如下程序: #include using namespace std; class Base{ private: void fun1( ) const {cout<<”fun1”;} protected: void fun2( ) const {cout<<”fun2”;} public: void fun3( ) const {cout<<”fun3”;} };

class Derived : protected Base{ public: void fun4( ) const {cout<<”fun4”;} };

int main(){ Derived obj; obj.fun1( ); //① obj.fun2( ); //② obj.fun3( ); //③ obj.fun4( ); //④ }

其中沒有語法錯誤的語句是(D )。

A.① B.② C.③

4.寫出程序運行結果 4.l#include using namespace std; class B1{ public: B1(int i){ cout<<”constructing B1 “<

class B2 { public: B2( ){ cout<<”constructing B3 *”<

D.④

};

class C:public B2, virtual public B1 { int j; public: C(int a,int b,int c):B1(a),memberB1(b) ,j(c){} private: B1 memberB1; B2 memberB2; };

int main( ){

C obj(1,2,3); }

constructing B1 1 constructing B3 * constructing B1 2 constructing B3 * destructing B3 destructing B1 destructing B3 destructing B1

4.2#include using namespace std; class B{ public: void f1(){cout<<\};

class D:public B{ public: void f1(){cout<<\};

void f(B& rb){ rb.f1(); }

int main( ){ D d; B b,&rb1=b,&rb2=d; f(rb1); f(rb2); return 0; } B::f1 B::f1 5.編程題

5.1定義一個Point類,派生出Rectangle類和Circle類,計算各派生類對象的面積Area()。

#include using namespace std; const double PI=3.14159; class Point { public: Point(double x=0, double y=0) {X=x;Y=y;} void ShowPoint() {cout<<\private: double X,Y; };

class Rectangle: public Point { public: Rectangle(double w,double h,double x,double y):Point(x,y) {width=w,height=h;Area();} void Area() {area= width*height;} void ShowArea(){ cout<<\ } private: double width,height,area; };

class Circle: public Point { public: Circle(double r,double x, double y):Point(x,y) {radius=r;Area();} void Area() {area= PI*radius*radius;} void ShowArea(){ cout<<\ } private: double radius,area; };

int main(){ Rectangle r(10,8,0,0); Circle c(4,3,5); r.ShowArea(); c.ShowArea(); return 0; }

5.2設計一個建筑物類Building,由它派生出教學樓Teach-Building和宿舍樓類Dorm-Building,前者包括教學樓編號、層數、教室數、總面積等基本信息,后者包括宿舍樓編號、層數、宿舍數、總面積和容納學生總人數等基本信息。 #include #include





黑龙江22选5兑奖期限