一、 基類與派生類的轉換
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中不包含派生類中增加的成員2、子型別關係是單向的、不可逆的。b是a的子型別,不能說a是b的子型別。只能用子類物件對其基類物件賦值,而不能用基類物件對其子類物件賦值,理由是顯然的,因為基類物件不包含派生類的成員,無法對派生類的成員賦值。同理,同一基類的不同派生類物件之間也不能賦值。b1.age=21;//正確,b1中包含派生類中增加的成員
2、派生類物件可以替代基類物件向基類物件的引用進行賦值或初始化。
如已定義了基類a物件a1,可以定義a1的引用:
a al; //定義基類a物件al引用r是al的別名,r和a1共享同一段儲存單元。可以用子類物件初始化引用r,將上面最後一行改為:b bl; //定義公用派生類b物件bl
a&r=al;//定義基類a物件的引用變數r,並用a1對其初始化
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的值?
通過本例可以看到:用 指向基類物件的指標變數指向子類物件是合法的、安全的,不會出現編譯上的錯誤。但在應用上卻不能完全滿足人們的希望,人們有時希望通過使用基類指標能夠調 用基類和子類物件的成員。如果能做到這點,程式人員會感到方便。在下一章就要解決這個問題。辦法是使用虛函式和多型性。
15 3 2 基類到派生類的轉換
從基類到派生類的自動轉換是不存在的。需要派生類物件時不能使用基類物件。item base base bulk item bulkp base error can t convert base to derived bulk tiem bulkref base error can t convert ...
基類和派生類
include include using namespace std class animal class dog public animal class dog public animal這裡的 就是繼承或派生,class cat public animal class item base st...
基類和派生類 this
基類指標在程式執行的時候的確指向的是乙個派生類的物件,但指標的型別仍然是基類指標。c 是一種強型別語言,因此不能用基類指標型別的指標直接呼叫派生類 而且,同乙個類可能有多種不同的派生類,因此不知道實際指向的會是哪個派生類。如果確信是某個派生類的話,可以用這樣的方法來呼叫 cb this b 1 cb...