C 下行轉換(DOWNCAST)問題。下行轉換之後的派生類指標能用派生類獨有的函式或成員嗎?

時間 2021-06-04 10:35:09

1樓:畫易

class

Derive

virtual

void

fun2

()};

void

test

()VS 除錯-> 轉到反彙編:

呼叫p1.fun()時:

物件通過ecx傳入,如果函式裡不用物件的話是無所謂的,就算是直接Derive*p1

=(Derive*)

NULL;p1

->fun();

也不會報錯的

呼叫p1.fun2()時:

virtual修飾的函式會去類物件裡定址,物件裡沒有的話就會出錯了

2樓:

1. C++中不要用C風格的型別轉換。

2. 非靜態的類成員函式都有個隱藏引數this指標,它的值就是呼叫時的物件的位址,#1看起來沒問題是因為你沒有用到任何跟this指標有關的東西,本質上呼叫了乙個靜態函式。你應該在幾個函式裡列印a和b的值看看。

如果訪問了不存在的成員變數或函式,是未定義行為,可能一不小心把銀行卡號和密碼發給壞人了。

3. dynamic_cast用在downcast的時候要求類是多型的(有虛函式),否則程式是不合法的。因為dynamic_cast要通過虛函式表確定指標的動態型別。

題中給的例子沒辦法通過dynamic_cast進行downcast。

C 物件型別轉換問題?

C十十20年 參見 C 程式設計精要教程 關於基類和派生類的記憶體布局,基類是派生類一部分。若基類沒有說明為虛基類,則基類位於派生類資料成員的前面,在這種情況下通過static cast等可以完成轉換,但是這導致程式是不安全的,因為當基類物件被作為派生類物件時,顯然其 派生類資料成員 是不存在的,呼...

C語言不同資料型別計算時轉換問題?

薛非 1.m a b 的計算過程中,是將a和b分別轉換為int型,還是將a b的結果轉換為int型?作為右值,所有短於int型別的資料都會被隱式地轉換為int或unsigned 所以m a b 本質上表達的是 m int a int b 這叫整數提公升 integer promotions 2.a ...

有關進製轉換的問題?

曲晉雲 首先,請問一下你自己,2的四次方是多少?也許你直接就回答16。那麼好,這個回答裡的16,你已經隱含地在使用10進製了。假如用八進位制來表示的話,2的四次方就不是16,而是20。計算機程式語言裡也是如此,表示數字的變數型別,用的是十進位制。以C語言為例,當你定義乙個變數 inta 這時變數a指...