2014-11-22 163 views
0

如果我有類似下面的代碼:切片,用什麼切片

class Base { /* ... */}; 
class Derived : public Base { /* ... */ }; 

int main() { 
    Base b = Derived{}; 
} 

然後代碼表現出切割問題。任何屬於類Derived但不屬於類Base的任何數據都將丟失。但假設Derived沒有任何不在Base中的數據成員或基類,所以沒有數據丟失。

此代碼是否仍然顯示未定義的行爲或其他問題?

+0

不,這裏沒有未定義的行爲。 – 2014-11-22 02:17:59

+0

切片不會導致未定義的行爲。只是將派生類複製到基類對象時會發生什麼 - 您失去了「派生性」。 – 0x499602D2 2014-11-22 02:20:33

+0

在這個例子中,你可以簡單地使B的派生類型,如你所知。 – 2014-11-22 02:22:15

回答

4

通常情況下,切片沒有不確定的行爲:它通常不會做你想做的事。在這種情況下,我看不到任何問題,但我也看不出爲什麼你需要一個沒有添加任何內容的子類。

+0

一個用例是如果你有隻讀句柄和變異句柄類。有意義的是,變異句柄擴展了只讀屬性,而只添加了功能(並且沒有數據成員)。 – rburny 2016-10-05 06:38:41

+0

@rburny除非我遺漏了某些東西(這是可能的),「可寫句柄」既不能繼承也不是可替代性測試。 – 2016-10-05 12:06:54

+0

我沒有看到問題。如果只使用const方法,則「可寫入句柄」可用作「只讀句柄」。它是「可寫的」,而不是「只寫」。 – rburny 2016-10-05 14:25:16