2012-03-18 88 views
0

這個問題很可能是「C++標準說的是什麼」的東西,但是我的Google搜索並沒有給出我正在尋找的答案。沒有成員函數的結構的繼承

我知道,當你有類,並且你有一個類繼承自另一個類時,你將進入虛擬函數表的世界,因爲代碼需要找出哪個類包含你試圖調用的函數。

但是,只包含數據的結構之間的繼承又如何呢?例如,如果你有一個小部件結構,然後你想要一個具有一些額外變量的結構的專用版本,但你仍然希望能夠將它的原始數據傳遞給處理小部件的函數,那麼將會更簡單從原始小部件結構繼承,而不是讓您的代碼處理兩種類型的小部件結構。當只有數據涉及繼承時,是否有任何開銷?專用小部件仍然是一個簡單的結構(在內存佈局方面),這兩個數據都是組合的,還是獨立於新數據存儲的原始小部件數據?最終,我想保持我的數據簡單且連續,因爲基本結構是,而且我不知道繼承數據是否會破壞數據。

回答

1

在C++內存模型中,對象總是在連續內存中佈局。如果你想擁有不連續的內存,你需要使用指向這個對象之外的數據的成員。也就是說,如果您繼承任何類,無論它是結構還是具有虛函數,那麼實際的對象總是連續的。關於可能感興趣的類型的其他含義很少:如果某個類是標準佈局類型,則可以例如memcpy()的對象。我不確定C++ 2011對繼承和標準佈局類型所說的話,但我確信C++ 2003不允許繼承,而C++ 2011允許它。

1

知道,當你上課,你必須從另一個類一個類繼承,你進入虛函數表

只有當你有虛函數的世界......

所以回答你的問題:如果你有一個普通的struct沒有成員函數,那麼編譯器將不會生成一個虛函數表。

順便說一句,你不應該擔心它,該表是每個類,並且每個實例只需要一個簡單的額外指針(如果使用簡單繼承)。

+0

非常真實。我提到它是使用繼承在幕後進行的一個例子。我不知道數據成員是否會在幕後做類似的事情。 – Nairou 2012-03-18 20:20:55

+1

@Nairou:不,沒有,因爲數據成員不是多態的。 – 2012-03-18 20:29:29