基類與派生類物件之間有賦值相容關係,由於派生類中包含從基類繼承的成員,具體表現在以下幾個方面,需要的朋友可以參考下
只有公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。基類與派生類物件之間有賦值相容關係,由於派生類中包含從基類繼承的成員,因此可以將派生類的值賦給基類物件,在用到基類物件的時候可以用其子類物件代替。
具體表現在以下幾個方面:
派生類物件可以向基類物件賦值。
可以用子類(即公用派生類)物件對其基類物件賦值。如
a a1; //定義基類a物件a1
b b1; //定義類a的公用派生類b的物件b1
a1=b1;
//用派生類b物件b1對基類物件a1賦值
在賦值時捨棄派生類自己的成員。
實際上,所謂賦值只是對資料成員賦值,對成員函式不存在賦值問題。請注意: 賦值後不能企圖通過物件a1去訪問派生類物件b1的成員,因為b1的成員與a1的成員是不同的。
假設age是派生類b中增加的公用資料成員,分析下面的用法:
a1.age=23;//錯誤,a1中不包含派生類中增加的成員
b1.age=21; //正確,b1中包含派生類中增加的成員
應當注意,子型別關係是單向的、不可逆的。b是a的子型別,不能說a是b的子型別。
只能用子類物件對其基類物件賦值,而不能用基類物件對其子類物件賦值,理由是顯然的,因為基類物件不包含派生類的成員,無法對派生類的成員賦值。同理,同一基類的不同派生類物件之間也不能賦值。
派生類物件可以替代基類物件向基類物件的引用進行賦值或初始化。
如已定義了基類a物件a1,可以定義a1的引用變數:
a a1; //定義基類a物件a1
b b1; //定義公用派生類b物件b1
a& r=a1; //定義基類a物件的引用變數r,並用a1對其初始化
這時,引用變數r是a1的別名,r和a1共享同一段儲存單元。也可以用子類物件初始化引用變數r,將上面最後一行改為
a& r=b1;//定義基類a物件的引用變數r,並用派生類b物件b1//對其初始化
或者保留上面第3行「a& r=a1;」,而對r重新賦值:
r=b1;//用派生類b物件b1對a1的引用變數r賦值
注意: 此時r並不是b1的別名,也不與b1共享同一段儲存單元。它只是b1中基類部分的別名,r與b1中基類部分共享同一段儲存單元,r與b1具有相同的起始位址。
如果函式的引數是基類物件或基類物件的引用,相應的實參可以用子類物件。如有一函式
複製**
**如下:
fun: void fun(a& r)//形參是類a的物件的引用變數
using namespace std;
class student//宣告student類
; student::student(int n, string nam,float s) //定義建構函式
void student::display( )//定義輸出函式
很多讀者會認為: 在派生類中有兩個同名的display成員函式,根據同名覆蓋的規則,被呼叫的應當是派生類graduate物件的display函式,在執行graduate::display函式過程中呼叫student::display函式,輸出num,name,score,然後再輸出pay的值。
事實上這種推論是錯誤的,先看看程式的輸出結果:
num:1001
name:li
score:87.5
num:2001
name:wang
score:98.5
並沒有輸出pay的值。
問題在於pt是指向student類物件的指標變數,即使讓它指向了grad1,但實際上pt指向的是grad1中從基類繼承的部分。
通過指向基類物件的指標,只能訪問派生類中的基類成員,而不能訪問派生類增加的成員。所以pt->display()呼叫的不是派生類graduate物件所增加的display函式,而是基類的display函式,所以只輸出研究生grad1的num,name,score3個資料。
如果想通過指標輸出研究生grad1的pay,可以另設乙個指向派生類物件的指標變數ptr,使它指向grad1,然後用ptr->display()呼叫派生類物件的display函式。但這不大方便。
通過本例可以看到: 用指向基類物件的指標變數指向子類物件是合法的、安全的,不會出現編譯上的錯誤。但在應用上卻不能完全滿足人們的希望,人們有時希望通過使用基類指標能夠呼叫基類和子類物件的成員。
我們會在下一講解決這個問題,辦法是使用虛函式和多型性
基類與派生類的轉換
一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...
基類與派生類的轉換
一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...
C 基類 派生類指標轉換
主要用到static cast和dynamic cast dynamic cast 1.dynamic cast是非常安全的,因為在不行的時候他會返回空指標 2.在多繼承中,由乙個基類轉換到另乙個基類,只能用dynamic cast 但是dynamic cast的使用是有侷限的,也就是基類一定要有虛...