Item 36 非虛擬的成員函式不能重定義

2021-08-25 20:18:20 字數 331 閱讀 2236

class b ; class d: public b ; d x; b *pb = &x; d *pd = &x; pb->mf(); // 呼叫的都是x的mf函式,若結果不一樣,你是否 pd->mf(); // 會奇怪?其實沒什麼,這類函式都是靜態繫結

虛函式才是動態繫結,在執行時根據指標指向的物件的實際型別,決定呼叫的函式。

引用和指標是一樣的,對於非虛函式,都是靜態繫結。

乙個「非虛擬」函式就意味著,某個類體系都要有這樣乙個共同的行為,所以在設計上重定義非虛函式也是錯誤的,會誤導客戶。

item 7說過,多型的dtor也要虛擬,和本文是一樣的道理,都是不希望函式被靜態繫結。

繼承中的非虛成員函式

都是在公共繼承的前提下。類成員函式包括常用的兩種。非虛函式和虛函式。非虛函式是靜態繫結,虛函式是動態繫結。繼承中的非虛函式 一般不用,都是在迷糊中錯用 這種情況下,呼叫哪個函式與指標型別有關,如果指標型別是子類型別,則呼叫子類的函式,如果是父類的型別呼叫父類的函式 1,類d會不會自己複製乙個和類a一...

類的大小和其成員函式(非虛)沒有關係

我們先來看看類的記憶體結構吧 class a int read public virtual int as 對於以上的類的說明,當建立乙個例項時,其記憶體結構如下 不同的c 實現略有不同 0000 成員變數 int a 0004 a vtable指標 0000 成員函式指標 as 為什麼op函式和r...

union中的成員不能有建構函式

最近在做專案的cta測試,快被折騰死了。專案中用到的開源庫alljoyn在編譯時報錯 in file included from target base alljoyn inc alljoyn message.h 36 0 from target base alljoyn inc alljoyn a...