2010-12-14 72 views
4

合法嗎?如果是這樣,你認爲這是不錯的編碼習慣嗎?使用基類方法初始化派生類成員

我想要做這樣的事情(不必要的細節未顯示):

class ItemStorage { 
    int size() const; 
}; 

class SpecialStorage : public ItemStorage { 
public: 
    SpecialStorage (...) : ItemStorage(...), items(ItemStorage::size()) {...} 
private: 
    int items; 
}; 

我敢肯定,這是確定的,如果該方法大小不虛。如果它是虛擬的並且派生類不覆蓋它呢?

回答

5

一般規則是,在初始化期間,您不能訪問對象的未初始化部分。由於ItemStorage已經初始化,當項目被初始化時,調用大小確實很好。即使大小是虛擬的,並且即使它被覆蓋,也仍然會很好:它只會調用基本版本(即虛擬方法僅綁定到正在構建的級別)。

+0

+1:我沒有注意到ItemStorage的構造函數被首先調用。 – Puppy 2010-12-14 23:08:39

+0

WOW。快速!非常感謝。 – watson1180 2010-12-14 23:11:54

+0

它只會調用基本版本,因爲它是明確指定的。否則,正在構建的對象是SpecialStorage,在這種情況下,調用可能不安全(依賴未初始化的成員)。 – UncleBens 2010-12-14 23:35:44

相關問題