C 派生類與基類的轉換規則

2021-06-29 12:42:25 字數 2273 閱讀 1836

基類與派生類物件之間有賦值相容關係,由於派生類中包含從基類繼承的成員,具體表現在以下幾個方面,需要的朋友可以參考下

只有公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。基類與派生類物件之間有賦值相容關係,由於派生類中包含從基類繼承的成員,因此可以將派生類的值賦給基類物件,在用到基類物件的時候可以用其子類物件代替。

具體表現在以下幾個方面

派生類物件可以向基類物件賦值。

可以用子類(即公用派生類)物件對其基類物件賦值。如

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的使用是有侷限的,也就是基類一定要有虛...