C 實驗8 房間類 家具類

2021-09-28 11:27:53 字數 4096 閱讀 3058

1、理解在各種繼承方式下建構函式和析構函式的執行順序; 

2、理解和掌握公有繼承、私有繼承和保護繼承對基類成員的訪問機制。

3、掌握虛基類的宣告、使用及其原理

物件導向程式設計中最重要的乙個概念是繼承。繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。這樣做,也達到了重用**功能和提高執行時間的效果。

當在多條繼承路徑上有乙個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個例項(或多個副本),若只想儲存這個基類的乙個例項,可以將這個公共基類說明為虛基類。虛基類的基本原則是在記憶體中只有基類成員的乙份拷貝,通過把基類繼承宣告為虛擬的,就只能繼承基類的乙份拷貝,從而消除歧義。

1.分別表示房間、休息室、教室、投影儀,沙發,為每個類設定成員變數、成員函式和建構函式,在主程式中生成物件進行測試。

**(詳細解釋見注釋):

#include#includeusing namespace std;

//房間類

class room

;room::room(string o, string t, string l, string rn, int f, int s)

void room::show()

room::~room()

//投影儀類

class projector

;projector::projector(string b, string m, string d, int br, string e, int fs)

void projector::show()

projector::~projector()

//沙發類

class sofa

;sofa::sofa(string b, string m, string t, string f, int p)

void sofa::show()

sofa::~sofa()

//課桌類

class desk

;desk::desk(string b, string m, string t)

void desk::show()

desk::~desk()

//休息室類

class lounge :public room,sofa

;lounge::lounge(string o, string t, string l, string rn, int f, int s, string b, string m, string tt, string ff, int p, int sn, string fl, string li, string ba) :room(o, t, l, rn, f, s), sofa(b, m, tt, ff, p)

void lounge::show()

lounge::~lounge()

//教室類

class classroom :public room, desk, projector

;classroom::classroom(string o, string t, string l, string rn, int f, int s, string b, string m, string d, int br, string e, int fs, int dn, string bb, string mm, string tt, int fa, int li, string ac):room(o, t, l, rn, f, s), projector(b, m, d, br, e, fs), desk(bb,mm,tt)

void classroom::show()

classroom::~classroom()

int main()

else if (flag == 2)

else if (flag == 3)

else if (flag == 4)

else if (flag == 5)

}return 0;

}

執行演示:

2.分別表示家具、沙發、床、沙發床,為每個類設定成員變數、成員函式和建構函式,正確使用虛基類,在主程式中生成物件進行測試

**(詳細解釋見注釋):

#include#includeusing namespace std;

//家具類

class furniture

;furniture::furniture(string b, string m, string t, string c, int p)

void furniture::show()

furniture::~furniture()

//床類

class bed:virtual public furniture

;bed::bed(string b, string m, string t, string c, int p, string st, int le):furniture(b,m,t,c,p)

void bed::show()

bed::~bed()

//沙發類

class sofa :virtual public furniture

;sofa::sofa(string b, string m, string t, string c, int p, string fa, int pl):furniture(b, m, t, c, p)

void sofa::show()

sofa::~sofa()

//沙發床類

class sofabed :public bed, sofa

;sofabed::sofabed(string b, string m, string t, string c, int p, string st, int le, string fa, int pl, string sn, string re) :furniture(b, m, t, c, p), sofa(b, m, t, c, p, fa, pl), bed(b, m, t, c, p, st, le)

void sofabed::show()

sofabed::~sofabed()

int main()

else if (flag == 2)

else if (flag == 3)

}return 0;

}

執行演示:

這次試驗總體來說難度不大吧,主要是學習虛基類的使用。我覺得更重要的問題是弄清楚使用虛基類是為了什麼,它解決了什麼問題。

就拿我們實驗二中經典的菱形結構為例來說,如果乙個派生類有多個直接基類(沙發床有沙發、床兩個直接基類),而這些直接基類又有乙個共同的基類(沙發、床有乙個共同的家具基類),則在最終的派生類中會保留該間接共同基類資料成員的多份同名成員(沙發裡會保留乙份品牌、型號等資訊,床裡也會有乙份)。這當然不是我們想要的,一件沙發床家具怎麼會有兩個品牌、兩個型號、兩個**呢?所以對於這種情況我們使用虛基類來只保留乙份資訊。這裡值得說明的是,虛基類不是在基類定義時宣告的,而是在派生類的派生方式時宣告的。利用虛基類我們能很好地解決多份同名成員的問題。

還在這記錄一下我的另乙個嘗試,因為我想知道,假如我在沙發床類中只對其兩個父類中的乙個,比如說沙發,做初始化,對於另乙個則不管。這樣會不會就不衝突了呢?我試了試,發現確實是不行的,只要類所繼承的兩個類有共同的父類,他們就不會對重複的部分做初始化,重複的部分會直接呼叫最開始的基類的建構函式來初始化,如果沒有主動呼叫的話,程式會自動呼叫其預設建構函式,若不存在則報錯。

C 實驗 類的應用

編寫提供3個成員函式 print函式將大整數列印出來 add函式大整數類的物件之間可以進行加法運算。思考 大整數類的物件和int型變數進行加法運算 思考的部分可以不用實現。編寫乙個測試程式,在測試hugeinteger類的成員函式。要求 類要用介面與實現分離的方式建立,即.h和.cpp檔案,測試檔案...

C 實驗類與物件

桂 林 理 工 大 學 實 驗 報 告 實驗名稱 類與物件 日期 2018年 04 月17 日 一 實驗目的 1 掌握類的定義和使用。2 掌握類的物件的宣告。3 複習具有不同訪問屬性的成員的訪問方式。4 觀察建構函式和析構函式的執行過程。5 使用vc 的debug除錯功能觀察程式流程,跟蹤觀察類的建...

c 類間關係,簡化理解

1.繼承關係 is a 類a被類b共有繼承,b的宣告形式 class b public a 2.組合關係 has a 如小鳥和翅膀的關係 類a是類b的一部分,實現形式為 class a class b 銷毀b時,會先銷毀a,a只能屬於b 3.聚合關係 弱所屬關係 如大雁和雁群的關係,大雁可以屬於不同...