實驗目的和要求
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)
編寫程序如下: