2013-11-20 78 views
0

我有2個類,A和B,都有函數g()。一個類的構造函數,爲其他..將調用什麼函數?

如果我做的:

(A*) a = (A*) new B; 

a->g(); 

函數g什麼類的()將被調用?

+0

是'B'的'A'基? g()聲明爲虛擬嗎? – Apokal

+0

你爲什麼不試試呢?放入A的函數printf(「In A」);'和B的函數'printf(「In B」);'。編譯,執行,你會看到.. :-) – sternze

+3

@sternze - 它可能是UB,測試可能沒用,甚至有害/誤導(特別是因爲這是一個C風格的演員)。 –

回答

3

如果A聲明函數爲虛擬,並且B繼承自A並覆蓋它,則將調用B::g

如果它不是虛擬的,或者沒有被覆蓋,那麼將會調用A::g

如果B不從A繼承,那麼行爲是不確定的,任何事情都可能發生。你可以通過使用隱式轉換來避免這種錯誤,如果知道它是有效的,編譯器將只允許它,而不是最危險的轉換類型,這將允許大多數指針轉換,無論它們是否有意義。

相關問題