基類與派生類的轉換

前提:公用派生類完整地繼承了基類的功能,使基類與派生類對象之間有賦值兼容關係。(賦值不考慮成員函數)

對於:

class A{}

class B{}

A a1,*pa1;

B b1,*pb1;

合法訪問:a1=b1;

A &aa=b1;//aa引用的是b1中繼承自基類的成員

pa1=&b1;//pa1能訪問到的也只能是b1中繼承自基類的成員

非法訪問:

b1=a1;//派生類b1中自己的數據成員在a1中是沒有的,因此無法賦值

B &bb=a1;

pb1=&a1;

基類對象不能賦值給派生類對象。




(1)派生類對象向基類對象賦值


在賦值時,要捨棄派生類自己的成員;

賦值只是對數據成員賦值,對成員函數不存在賦值問題;

賦值後不能企圖通過對象a1去訪問派生類對象b1中自己的成員。

(2)派生類對象替代基類對象

派生類對象替代基類對象可以向基類對象的引用進行賦值或初始化。



(3)子類對象當實參傳遞給基類形參(傳值/傳地址/引用)

在函數中只能訪問派生類中繼承自基類成員的值。

函數的參數是基類對象或者基類對象的引用或者是指向基類對象的指針,相應的實參可以用派生類的對象(如果形參爲指針,則實參爲派生類對象的地址)。


(4)指向基類對象的指針變量也可以指向派生類對象


對於上面的程序來說,pt->display()執行的並不是grad1也就是Graduate類中的display函數,否則的話就還會輸出pay。因此它執行的是派生類中繼承自基類中的display函數。