實驗五 繼承與派生
實驗目的和要求
1.掌握派生類的定義方法的和派生類建構函式定義方法。
2.掌握在不同繼承方式的情況下,基類成員在派生類中的訪問許可權。
3.掌握在多繼承方式的情況下,建構函式與解構函式的呼叫時機與順序。
實驗內容
1.除錯下列程式,並在對程式進行修改後再除錯,指出除錯中出錯原因。
執行結果://sy5_1.cpp #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時,編譯程式指出語句2、語句5、語句7有錯。這是因為當類的繼承方式為私有繼承時,基類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時,會出現哪些錯誤和不正常現象?為什麼?
答:主函式中的語句5、語句9出現了錯誤;因為B採用的是公有繼承,所以B中和主函式中不能訪問A中的私有函式。
(4)派生類B的繼承方式仍為public,將類A中的資料成員int型變數a的訪問許可權改為protected時,會出現哪些錯誤和不正常現象?為什麼?
答:主函式中的語句5出現了錯誤;因為B採用公有繼承,所以A中保護成員在B中仍為保護成員,B中可以訪問A中的保護成員,但不能通過類的物件訪問類的保護成員。
2.重寫教材中的Li4_10.cpp,給每個類增加一個解構函式,並使類之間的關係如附圖1所示,再寫出程式的輸出結果。(sy5_2.cpp)
附圖1 類之間的關係
修改程式如下:
//sy5_2.cpp
#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)
編寫程式如下:#include<iostream>
#include<string>
using namespace std;
class teacher{
public:
teacher(string name,char sex,int age,string title,string course)
{
nam=name;
s=sex;
a=age;
t=title;
c=course;
}
void print()
{
cout<<"name: "<<nam<<endl;
cout<<"sex: "<<s<<endl;
cout<<"age: "<<a<<endl;
cout<<"title: "<<t<<endl;
cout<<"course: "<<c<<endl;
}
protected:
string nam;
char s;
int a;
string t;
string c;
};
class student{
public:
student(string name,char sex,int age,int number, string department)
{
nam=name;
s=sex;
a=age;
num=number;
dep=department;
}
void print()
{
cout<<"name: "<<nam<<endl;
cout<<"sex: "<<s<<endl;
cout<<"age: "<<a<<endl;
cout<<"number: "<<num<<endl;
cout<<"department: "<<dep<<endl;
}
protected:
string nam;
char s;
int a;
int num;
string dep;
};
class gradstudent:public student
{
public:
gradstudent(string name,char sex,int age,int number, string department,string professor):student(name,sex,age,number,department)
{
pro=professor;
}
void print()
{
cout<<"name: "<<nam<<endl;
cout<<"sex: "<<s<<endl;
cout<<"age: "<<a<<endl;
cout<<"number: "<<num<<endl;
cout<<"department: "<<dep<<endl;
cout<<"professor: "<<pro<<endl;
}
private:
string pro;
};
int main()
{
cout<<"*********************************************"<<endl;
cout<<"******歡迎您來到學生和教師檔案查詢系統*******"<<endl;
cout<<"*********************************************"<<endl;
int i,j;
teacher teac("shishuaishuai",'m',27,"js","mxdx");
student stu("liendan",'w',22,22,"computer");
gradstudent grad("chengkai",'m',25,12,"computer","hzp");
cout<<endl;
loop:cout<<"請輸入你要查詢的物件:"<<endl<<"1.教師; 2.學生; 3.研究生。"<<endl;
{
cin>>i; if(i==1)teac.print();
else if(i==2) stu.print();
else grad.print();
}
cout<<endl;
cout<<"是否繼續查詢? 1.yes 2.no"<<endl; cin>>j;
if(j==1) goto loop;
else return 0;
}
程式輸出結果如下:
4.試寫出所能想到的所有形狀(包括二維的和三維的),生成一個形狀層次類結構。生成的層次結構一Shape作為基類,並由此派生出TwoDimShape類和ThreeDimShape類。它們的派生類是不同形狀類,定義層次結構中的每一個類,並用函式main()進行測試。(sy5_4.cpp)
編寫程式如下:
//sy5_4.cpp #include<iostream> using namespace std; class Shape { public: Shape(){}; double area() const{return 0.0;} double bulk() const{return 0.0;} }; class TwoDimShape:public Shape{}; class Circle:public TwoDimShape { public: Circle(double r){R=r;} double area()const{return 3.14*R*R;} protected: double R; }; class ThreeDimShape:public Shape{}; class sphere:public ThreeDimShape { public: sphere(double w){R=w;} double bulk()const{return 4/3*3.14*R*R*R;} protected: double R; }; int main() { Shape sha; double area; double bulk; Circle c(7.0); area=c.area(); cout<<"Area of circle is "<<area<<endl; sphere sph(9.0); bulk=sph.bulk(); cout<<"Bulk of sphere is "<<bulk<<endl; return 0; }
程式輸出結果如下:
分析與討論
1.通過對實驗內容中第1題的除錯,總結不同繼承方式的情況下,基類成員在派生類中的訪問許可權。
答:當類的繼承方式為公有繼承時,在派生類中,基類的公有成員和保護成員被繼承後分別作為派生類的公有成員和保護成員,這樣使得派生類的成員函式可以直接訪問它們,而派生類成員函式無法直接訪問基類的私有成員。在類的外部,派生了的物件可以訪問繼承下來的基類公有成員。 當類的繼承方式為私有繼承時,在派生類中,基類的公有成員和保護成員作為派生類的私有成員,派生類的成員函式可以直接訪問它們,而派生類的成員函式無法直接訪問基類的私有成員。在類外部,派生類的物件無法訪問基類的所有成員。
當類的繼承方式為保護繼承時,在派生類中,基類的公有成員和保護成員作為派生類的保護成員,派生類的成員函式可以直接訪問它們,而派生類的成員函式無法直接訪問基類的私有成員。在類外部,派生類的物件無法基類的所有成員。
2.解釋實驗內容第2題的執行結果,總結多繼承方式的情況下,建構函式與解構函式的呼叫時機與順序。虛基類的建構函式與普通基類的建構函式在呼叫時有什麼不同?
答:建構函式的呼叫順序:先呼叫所有基類的建構函式,再呼叫派生類中子物件類的建構函式(如果派生類中沒有子物件),最後呼叫派生類的建構函式。
虛基類的建構函式的呼叫順序:遵循兩個原則,而且按順序優先滿足:1 先呼叫完所以基類,再呼叫子類;2 先呼叫虛擬基類,再呼叫非虛擬基類,一旦呼叫了虛擬基類的建構函式,則非虛擬基類建構函式就按照宣告的順序被呼叫。
普通基類的建構函式:虛基類建構函式、普通基類建構函式、子類建構函式和其他(從左至右依次執行)。
3.如果希望附圖1中的Base1、Base2均有兩個,如何修改順序?
實驗總結:
通過本章的學習瞭解類的繼承,三種繼承方式的區別,以及通過引數列表對派生類的成員賦值的方法,即呼叫基類建構函式後再對新增成員賦值,虛基類的使用時為了對基類資料儲存一份拷貝,應注意的是在基類其他的直接派生類繼承時也應宣告是虛基類,多重繼承時的應注意建構函式賦值的規律;只是在本次實驗的操作過程中還是存在了很多的問題需要我們認真的去學習和思考,同時也讓我意識到自己對於本次的實驗中的一些知識點還沒有掌握好,需要自己在課下多花時間來學習。
相關推薦
實驗五 繼承與派生
實驗目的和要求1.掌握派生類的定義方法的和派生類建構函式定義方法。2.掌握在不同繼承方式的情況下,基類成員在派生類中的訪問許可權。3.掌握在多繼承方式的情況下,建構函式與解構函式的呼叫時機與順序。實驗內容1.除錯下列程式,並在對程式進行修改後再除錯,指出除錯中出錯原因。//s
C++學習筆記 (五) ---- 繼承與派生
①、繼承可以理解為一個類從另一個類獲取成員變數和成員函式的過程,被繼承的類稱為基類,繼承的類稱為派生類。 派生類除了擁有基類成員,還可以自定義新成員。 #include<iostream> using namespace std; //基類 Pelple class Peopl
c++實驗5_3繼承與派生(3)
五、實驗結果及分析 1. 繼承方式為公有時,age設為私有型別時不能直接賦值,因為不能訪問。改為公有或保護型別,執行沒有問題; 繼承方式為保護時,age設為私有型別時不能直接賦值,因為不能訪問。改為公有或保護型別,執行沒有問題; 繼承方式為私有時,age為何種形式都不能
實驗8 繼承與派生
實驗8 繼承與派生 一、實驗目的 理解繼承的含義,掌握派生類的定義和實現方法。 理解公有繼承下基類成員對派生類成員和派生類物件的可見性,能正確地使用繼承層次中的各種類成員。 理解保護成員在繼承中的作用,能夠在適當的時候使用保護成員以便派生類成員可以訪問基類的部分非公開
C++繼承與派生
規則 方法 三種 賦值兼容 順序 spa 構造 指針 rtu 2017-06-25 23:00:59 c++中的繼承和派生是面向對象編程中的一個重要內容,通過繼承可以實現代碼的復用,同時繼承也是實現多態性的基礎。 一、c++繼承的基本形式 class 派生類名:繼承方式 基
走入計算機的第二十九天(繼承與派生)
利用 過程 調用 概念 針對 sed ive .cn log 一 什麽是繼承 繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類 單繼承:就相當於子類繼承了一個父類。 多繼承:就相當於子類
動手動腦之繼承與派生
args 編寫代碼 自己 [] 變量引用 技術 extend 動物 ++ 1.自行編寫代碼驗證在子類中,若要調用父類中被覆蓋的方法,可以使用super關鍵字 class animal { public void tedian(int a,int b) {
面向對象之繼承與派生
log ont gree 選擇 重名 ntc 函數調用 關系 csdn 閱讀目錄 一 初識繼承 二 繼承與抽象(先抽象再繼承) 三 繼承與重用性 四 派生 五 組合與重用性 六 接口與歸一化設計 七 抽象類 八 繼承實現的原理(可惡的菱形問題) 九 子類中調用父類的
繼承與派生
權限 net 成員函數 public 派生類 prot 要求 軟件 class 軟件的可重用性,指的是在不同軟件的開發過程中重復使用相同或相似軟件元素的過程。C++強調軟件的可重用性,並且提供了繼承機制來解決軟件的可重用性問題。 4.2 單繼承 4.2.1 單繼承的定義方
python之旅:面向對象之繼承與派生
之間 aps 過程 數據 區別 tcl 數據屬性 同時 什麽是 一 初識繼承 編寫類時,並非總要從空白開始。如果你要編寫的類正好是另一個現成類的特殊版本,可使用繼承來減少代碼冗余,子類會“遺傳”父類的屬性,從而解決代碼重用問題 什麽是繼承 繼
C++語言學習(十)——繼承與派生
child mem 公有 char 單繼承 同名成員函數 重定義 重載函數 顯示 C++語言學習(十)——繼承與派生 一、類之間的關系 1、類之間的組合關系 組合關系是整體與部分的關系。組合關系的特點:A、將其它類的對象作為當前類的成員使用B、當前類的對象與成員對象的生命周
類的繼承與派生
天氣 class spa exe derived 添加 man 擴展 繼承與派生 繼承 inheritance / 派生 derived 什麽繼承/派生 繼承是指從已有的類中派生出新的類,新類具有原類的行為,並能擴展新的行為 派生類就是從一個已有類中衍
繼承與派生(4):二義性(三角繼承和菱形繼承)
一般說來,在派生類中對基類成員的訪問應該是唯一的,但是,由於多繼承情況下,可能造成對基類中某成員的訪問出現了不唯一的情況,則稱為對基類成員訪問的二義性問題。 實際上,在上例已經出現過這一問題,回憶一下上例中(參照繼承
繼承與派生(3):多繼承
多繼承可以看作是單繼承的擴 展。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是一個單繼承。 • 多繼承是指派生類可以有一個以上的直接基類。多繼承的派 生類定義格式為: class <派生類名>: [<繼承方式>] <基類名
private與protected的使用(繼承與派生)
class base{ private: int a1; protected: int b1; public: base(int a, int b) :a1(a), b1(b){} ~base(){}; void show(){ cout << a1 <&l
面向物件【林老師版】:繼承與派生(六)
一、初識繼承 1、什麼是繼承 繼承指的是類與類之間的關係,是一種什麼“是”什麼的關係,繼承的功能之一就是用來解決程式碼重用問題 繼承是一種建立新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可以成為基類或超類,新建的類稱為派生類或子類 2、python中類的繼承分為:單繼承和多繼承
實驗五:樹與二叉樹的實驗二
一、實驗目的 1、 熟練理解樹和二叉樹的相關概念,掌握的儲存結構和相關操作實現; 2、 掌握樹的順序結構的實現; 3、 學會運用樹的知識解決實際問題 二、實驗內容 1、自己確定一個二叉樹(樹結點型別、數目和結構自定)利用鏈式儲存結構方法儲存。實 現樹的構造,並完成: 1) 用前序
【7】C++進階系列(類的繼承與派生)
1、繼承的概念 繼承:在儲存原有類的屬性和功能的基礎上,擴充套件新的功能。 開發類庫的團隊和使用類庫的團隊很可能不是一個,有些東西是不能訪問的。 繼承和派生是同一個問題的不同視角: 保持已有類的特性而構建新類的過程成為繼承;在已有類的基礎上新增自己的特性而產生新類的過程叫做派生。
繼承與派生的區別和聯絡
繼承與派生其實是同一過程從不同的角度看,我們將保持已有類的特性而構造新類的過程稱為繼承,說白了繼承的目的就是實現原來設計與程式碼的重用,希望儘量利用原有的類。然而當新的問題出現,原有程式無法解決或不能完全解決時,需要對原有程式進行改造,在已有類的基礎上新增自己的特性而產生新類的過程稱為派
C++學習筆記——繼承與派生
繼承與派生是同一過程從不同角度的描述: 保持已有類的特性而構造新類的過程稱為繼承。 在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。 被繼承的已有類稱為基類(或父類)。 派生出的新類稱為派生類(或子類)。 直接參與派生出某類的基類稱為直接基類。 基類的基類