一、 基類與派生類的轉換
3種繼承方式(公用、保護、私有繼承)中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。
不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包含從基類繼承的成員,因此可以將派生類的值賦給基類物件,在用到基類物件的時候可以用其子類物件代替。
注意:有的資料型別是不可轉換的;有的轉換是不可逆的。
1、派生類物件可以向基類物件賦值。
可以用子類(即公用派生類)物件對其基類物件賦值。
如:
a al;
//定義基類a物件al
b bl;
//定義類a的公用派生類b的物件bl
a1=b1;
//用派生類b物件bl對基類物件al賦值
實際上,所謂賦值只是對資料成員賦值,對成員函式不存在賦值問題。
注意:
1、賦值後不能企圖通過物件a1去訪問派生類物件bl的成員,因為bl的成員與al的成員是不同的。假設ase是派生類b中增加的公用資料成員,分析下面的用法:
a1.age=23;//錯誤,al中不包含派生類中增加的成員 b1.age=21;//正確,b1中包含派生類中增加的成員2、子型別關係是單向的、不可逆的。b是a的子型別,不能說a是b的子型別。只能用子類物件對其基類物件賦值,而不能用基類物件對其子類物件賦值,理由是顯然的,因為基類物件不包含派生類的成員,無法對派生類的成員賦值。同理,同一基類的不同派生類物件之間也不能賦值。
2、派生類物件可以替代基類物件向基類物件的引用進行賦值或初始化。
如已定義了基類a物件a1,可以定義a1的引用:
a al;//定義基類a物件al b bl;//定義公用派生類b物件bl a&r=al;//定義基類a物件的引用變數r,並用a1對其初始化引用r是al的別名,r和a1共享同一段儲存單元。可以用子類物件初始化引用r,將上面最後一行改為:
a&r=bl;//定義基類a物件的引用變數r,並用派生類b物件b1對其初始化或者保留上面第3行「a&r=al;」,而對r重新賦值:
r=bl;//用派生類b物件bl對a1的引用變數r賦值
注意
3、如果函式的引數是基類物件或基類物件的引用,相應的實參可以用子類物件。
如有一函式fun:
void fun(a&r)//形參是類a的物件的引用
;student::student(int n,string nam,float s)//定義建構函式
void student::display()
//定義輸出函式
;
//工資
void graduate::display()
//定義輸山函式
程式的輸出結果:
num:1001
name:li
score:87.5
num:2001
nume:wang
score:98.5
為什麼沒有輸出pay的值?
通過本例可以看到:用指向基類物件的指標變數指向子類物件是合法的、安全的,不會出現編譯上的錯誤。但在應用上卻不能完全滿足人們的希望,人們有時希望通過使用基類指標能夠呼叫基類和子類物件的成員。如果能做到這點,程式人員會感到方便。在下一章就要解決這個問題。辦法是使用虛函式和多型性。
基類與派生類的轉換
一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...
派生類到基類的轉換 和基類到派生類的轉換
一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...
基類與派生類
初學c 的時候,很多人都很頭疼各種訪問標號下基類與派生類的關係,其實,死記硬背肯定不是乙個好的辦法,要知道它們之間的關係,先要分析一下訪問標號是如何產生的 在沒有繼承之前,類的只有兩類使用者 類本身和類的使用者。把類成員通過public和private劃分恰好體現了這一分割 類的使用者只能訪問類的p...