由vector造成的物件切片問題

2021-05-23 08:22:45 字數 845 閱讀 1849

由vector造成的物件切片

在編寫乙個小例項的時候,發現用vector存放基類,而試圖呼叫子類的虛函式是行不通的!**如下:

這樣的結果是我當初的構想完全不一樣的,那麼為什麼會造成這種現象呢?

先從物件大小的角度來看:

由於宣告的是vector,那麼每個元素的大小就是sizeof(base),如果轉入的是子類,那實際上進入vector的「合法」大小也僅為sizeof(base),超過這部分的大小,將被忽略,這就是物件切片(object slicing)。

再從虛函式表的角度來看:

我們知道,c++實現多型的原理就是利用了虛函式表,每個物件在定義後的頭4個位元組就是乙個指向虛函式表的指標(而虛函式表則是每個類共享乙份),這是在編譯器就確定的,在執行時再通過虛函式表的指標找到真正的實現函式的首位址。那麼心細的朋友可能發現了,**:

v1.push_back( child() );

明明定義了乙個child物件,也就是在臨時物件中的虛函式表指標是指向child的show函式的,那麼放入v1的物件也應該是擁有指向child的虛函式表指標的吧?

答案是否定的,我們來看push_back的**(gcc):

就是說,其實在vector中存放的已經是徹底的base了。。。

因此通過宣告vector來實現多型是不行的。

那麼如果才能通過vector來實現多型呢?

可以用存放指標的方法:vector示例**如下:

當然在實際專案中用智慧型指標會是更好的選擇!

python切片的物件 Python切片物件和

python中是否存在某種內部機制,它以不同的方式處理傳遞給 getitem 的引數,並自動將start stop step構造轉換為片?在 這是我的意思class exampleclass object def getitem self,args return args def call self...

實現可切片的物件

ist序列的切片說明 模式 start end step 其中,第乙個數字start表示切片開始位置,預設為0 第二個數字end表示切片截止 但不包含 位置 預設為列表長度 第三個數字step表示切片的步長 預設為1 當start為0時可以省略,當end為列表長度時可以省略,當step為1時可以省略...

95 的bug是由程式設計師造成的

作者在twitter上發的一條短訊 在怨天尤人之前,我們應該先自我反省 努力把自身的問題解決了。12 22 pm 2012 5 30 你應該知道那種感覺。我們所有人都曾碰到過這樣的事情 你已經盯著 看了無數遍,但還是沒有發現任何問題。然而,有個故障或者錯誤始終揮之不去。於是你開始懷疑,一定是你開發程...