C 實現之 轉型

2022-09-14 06:57:08 字數 1719 閱讀 4493

c++中的轉型語法有三種形式:

1)c風格的轉換:

t(expression)

(t)expression

上面兩種形式都是將expression轉換為t型別。

2)c++新型轉換:

a. const_cast(expression)

將物件的常量性轉除,是唯一有此能力的c++風格轉型操作符;

b. dynamic_cast

(expression)

主要用來執行「安全向下轉型」,也就是覺得物件是否歸屬繼承體系中的某個型別。它是唯一無法由舊式語法執行的動作,也是唯一可能耗費重大執行成本的轉型動作。

c. reinterpret_cast

(expression)

意圖執行低階轉型,實際動作可能取決於編譯器,因此不可移植。如將乙個pointer to int 轉為int。這一類轉型在低階**意外很少見。

d. s

tatic_cast

(expression)

用來強迫隱式轉換,如將non-const轉換為const物件,將int型別轉為double型別。 

使用中,舊式型別及(1)中的方式仍然是合法的,但新的c++轉換型別更受歡迎,因為它很容易在**中被人工或者工具辨識,而且,它方便編譯器捕捉錯誤。

在c++中,轉型並不是什麼都沒做,任何乙個型別轉換往往真的令編譯器編譯出執行期間執行的**,例如將int轉換為double時,由於在大部分計算器體系結構中,int的底層表述不同於double的底層表述,所以這一轉換幾乎肯定會產生一些**。

另外,如果你要對自己進行轉型操作時,請格外注意,例如下面的**:

1

class

window25

...6};7

8class

specialwindow :public

window916

...17 };

上面的**中的本意是在派生類的onresize成員函式中先呼叫基類的onresize函式,為了呼叫基類的函式,程式中將派生類轉換為window,然後呼叫window的onresize函式,然後實現自己的具體行為。但真的實現卻是這樣的,它首先產生乙個當前物件的base class成分的乙個副本,然後呼叫副本的成員函式onresize,而不是真正在本物件上的base class成分中呼叫基類函式,因此如果base class的成員函式中有對屬性的修改操作,假設specialwindow的成員函式onresize也對屬性有修改操作,那麼其物件執行onresize後,base class的成分是沒有被修改的,而派生來的成分則是修改了的,這顯然是不合理的。為了解決這個問題,應拿掉型別轉換,執行如下:

1

void

onreize()

2

通常情況下,dynamic_cast的許多實現版本執行速度非常慢,例如在深度繼承和多重繼承體系中,乙個物件的轉換可能涉及到許多個物件的轉換,因此要格外注意。在非常注重效率的程式中,要對dynamic_cast保持高度敏感和猜疑。它的通常的乙個用法是將base class的pointer或者reference轉換為derived class的pointer或reference,但通常情況下,這可以被其他方法所替代,如通過virtual函式。

總之,優良的c++**需要應盡量避免轉型操作,如果實在需要,也最好將它隔離在函式中,這樣函式的呼叫者就不會受函式內部的行為的影響。 

以上整理自effective c++ 中文版第三版case 27. 

C 多型之向上轉型

基類中的虛函式允許派生類繼承時重寫此函式 虛函式使用virtual關鍵字修飾 重寫時有兩種重寫方式 1.使用override重寫 覆蓋父類中的原函式 無論是父類還是子類的例項都去呼叫子類中重寫的方法 2.使用new 可省略 重寫 隱藏父類中的原函式 隱藏方法中父類的例項呼叫父類的方法,子類的例項呼叫...

多型之向下轉型(強制轉型)

多型的一種表現,子類引用指向父類物件,稱為向下轉型。向下轉型是強制轉換,因為子類可能有自定義的屬性和方法,所以父類物件向子類型別轉換的時候,需要借助外力,即強制轉換。我們在向上轉型的時候,舉了乙個印表機的例子,因為是同一臺印表機,只是列印的條件不同,呼叫的都是列印方法。但是我們生活中還有別的,條件不...

C 向上轉型和向下轉型

子類物件賦給父類型別的變數,稱為向上轉型。父類型別的物件賦給子類型別的變數,稱為向下轉型。上個例子,vegetable是父類,potato是子類。class potato vegetable class program 總結 1 對於自定義類而言,向上轉型是c 語言提供的機制。2 向下轉型是形式上的...