實驗五

實驗目的和要求

1.掌握派生類的定義方法的和派生類構造函數定義方法。

2.掌握在不同繼承方式的情況下,基類成員在派生類中的訪問權限。

3.掌握在多繼承方式的情況下,構造函數與析構函數的調用時機與順序。

實驗內容

1.調試下列程序,並在對程序進行修改後再調試,指出調試中出錯原因。

#include<iostream>  
using namespace std;  
class A  
{  
public:  
   void seta(int i){a=i;}  
   int geta(){return a;}  
public:  
    int a;  
};  
class B:public A  
{  
    public:  
      void setb(int i){b=i;}  
      int getb(){return b;}  
      void show(){cout<<"A::a="<<a<<endl;}  
    public:  
    int b;  
};  
int main()  
{  
   B bb;  
   bb.seta(6);  
   bb.setb(3);  
   bb.show();  
   cout<<"A::a="<<bb.a<<endl;  
   cout<<"B::b="<<bb.b<<endl;  
   cout<<"A::a="<<bb.geta()<<endl;  
   cout<<"B::b="<<bb.getb()<<endl;  
   return 0; 
}


程序運行結果:


按下列要求對程序進行修改,然後調試,對出現的錯誤分析其原因。

(1)將派生類B的繼承方式改爲private時,會出現哪些錯誤和不正常現象?爲什麼?

答:出現的現象如下:


將派生類B的繼承方式改爲private,類的繼承方式爲私有繼承,基類A的公有成員函數a,公有成員函數seta()和geta()作爲派生類B的私有成員,派生類成員可以直接訪問它們,但在類外部,派生類的對象無法訪問它們。

(2)將派生類B的繼承方式改爲protected時,會出現哪些錯誤和不正常現象?爲什麼?

答:將派生類B的繼承方式改爲protected時,編譯程序指出語句2、語句5、語句7有錯。這是因爲當類的繼承方式爲保護繼承時,基類A的公有數據成員a,公有成員函數seta()和geta()作爲派生類B的保護成員,派生類成員可以直接訪問它們,但在類外部,派生類的對象無法訪問它們。

(3)將派生類B的繼承方式恢復爲public,再將類A中的數據成員int型變量a的訪問權限改爲private時,會出現哪些錯誤和不正常現象?爲什麼?

答:出現的現象:


因爲a是私有繼承,所以不能被派生類的子類對象訪問,因此程序錯誤。

(4)派生類B的繼承方式仍爲public,將類A中的數據成員int型變量a的訪問權限改爲protected時,會出現哪些錯誤和不正常現象?爲什麼?

2.重寫教材中的Li4_10.cpp,給每個類增加一個析構函數,並使類之間的關係如附圖1所示,再寫出程序的輸出結果。


修改程序如下:
#include<iostream>
using namespace std;
class Base1
{
public:
   Base1(){cout<<"constructing Base1"<<endl;}
   ~Base1(){cout<<"destructing Base1"<<endl;}
};
class Base2
{
    public:
      Base2(){cout<<"constructing Base2"<<endl;}
     ~Base2(){cout<<"destructing Base2"<<endl;}
};
class Derived1:public Base2,virtual public Base1
{
    public:
    Derived1(){cout<<"constructing Derived1"<<endl;}
    ~Derived1(){cout<<"destructing Derived1"<<endl;}
};
class Derived2:public Base2,virtual public Base1
{
    public:
    Derived2(){cout<<"constructing Derived2"<<endl;}
    ~Derived2(){cout<<"destructing Derived2"<<endl;}
};
class Derived3:public Derived1,virtual public Derived2
{
    public:
    Derived3(){cout<<"constructing Derived3"<<endl;}
    ~Derived3(){cout<<"destructing Derived3"<<endl;}
};
int main()
{
   Derived3 obj;
   return 0;
}


輸出結果如下:

3.利用繼承性與派生類來管理學生和教師的檔案。假設要管理下述幾類人員的如下一些數據。

  teacher(教師)類:姓名、性別、年齡、學號、系別;

  gradstudent(研究生)類:姓名、性別、年齡、學號、系別、導師;

  要求每個類只設立構造函數以及顯示類對象數據的成員函數。編寫主函數,說明有關類對象,並對其類成員函數進行簡單使用。(sy5_3.cpp)

編寫程序如下:

程序輸出結果如下:

4.試寫出所能想到的所有形狀(包括二維的和三維的),生成一個形狀層次類結構。生成的層次結構一Shape作爲基類,並由此派生出TwoDimShape類和ThreeDimShape類。它們的派生類是不同形狀類,定義層次結構中的每一個類,並用函數main()進行測試。(sy5_4.cpp)

編寫程序如下:


心得體會:
本次實驗要求我們掌握派生類的定義方法的和派生類構造函數定義方法;掌握在不同繼承方式的情況下,基類成員在派生類中的訪問權限;掌握在多繼承方式的情況下,構造函數與析構函數的調用時機與順序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章