型別轉換與繼承

2021-07-02 00:01:15 字數 1198 閱讀 5083

可以將基類的指標或引用繫結到派生類物件上有一層極為重要的含義:當使用基類的引用(或指標),實際上我們並不清楚該引用(或指標)所繫結物件的真實型別。

靜態型別和動態型別

當我們使用存在繼承關係的型別時,必須將乙個變數或其他表示式的靜態型別與該表示式表示物件的動態型別區分開來。表示式的靜態型別在編譯時總是已知的,它是變數宣告時的型別或表示式生成的型別;動態型別則是變數或表示式表示的記憶體中的物件的型別。動態型別直到執行時才可知。

如果表示式既不是引用也不是指標,則它的動態型別永遠與靜態型別一致。

基類的指標或引用的靜態型別可能與其靜態型別不一致。

不存在從基類向派生類的隱式型別轉換

因為乙個基類的物件可能是派生類物件的一部分,也可能不是,所以不存在從基類向派生類的自動型別轉換:

base base;

derived* derivedptr = &base; // 錯誤:不能將基類轉換成派生類

derived& derivedref = base; // 錯誤:不能將基類轉換成派生類

即使乙個基類指標或引用繫結在乙個派生類物件上,我們也不能執行從基類向派生類的轉換。

如果在基類中含有乙個或多個虛函式,我們可以使用dynamic_cast請求乙個型別轉換,該轉換的安全檢查將在執行時執行。同樣,如果我們已知某個基類向派生類的轉換是安全的,則我們可以使用static_cast來強制覆蓋掉編譯器的檢查工作。

在物件之間不存在型別轉換

派生類向基類的自動轉換只對指標或引用型別有效,在派生類型別和基類型別之間不存在這樣的轉換。

當我們用乙個派生類物件為乙個基類物件初始化或賦值時,只有該派生類物件中的基類部分會被拷貝、移動或賦值,它的派生類部分將被忽略掉。

存在繼承關係的型別之間的轉換規則

要想理解在具有繼承關係的類之間發生的型別轉換,有三點非常重要:

1。從派生類向基類的型別轉換只對指標或引用型別有效。

2。基類向派生類不存在隱式型別轉換。

3。和任何其他成員一樣,派生類向基類的型別轉換也可能會由於訪問受限而變得不可行。

繼承的建構函式,多重繼承,型別轉換與虛繼承

一 繼承的建構函式 派生類,也就是子類,它繼承了基類,當然也就繼承了基類的資料成員,我們知道,生成乙個物件是要呼叫建構函式的,這裡的子類當然也不例外,而且有經典的同學肯定也會知道,生成乙個子類物件時,不僅會呼叫子類的建構函式,而且還會呼叫父類的建構函式。我們在這裡分析一下子類的建構函式的書寫規則問題...

轉換與繼承

1 我們已經看到,可以將派生型別的物件傳給希望接受基類引用的函式。也許會因此認為物件進行轉換,但是,事實並非如此。將物件傳給希望接受引用的函式時,引用直接繫結到該物件,雖然看起來在傳遞物件,實際上實參是該物件的引用,物件本身未被複製,並且,轉換不會在任何方面改變派生型別物件,該物件仍是派生型別物件。...

關於繼承中的強制型別轉換

dynamic cast是與繼承相關的型別轉換關鍵字 dynamic cast要求相關的類中必須有虛函式 用於直接或者間接繼承關係的指標 引用 之間 指標 轉換成功 得到目標型別的指標 轉換失敗 得到乙個空指標 引用 轉換成功 得到目標型別的引用 轉換失敗 得到乙個異常操作資訊 編譯器會檢查dyna...