2010-12-14 15 views
4

それは合法ですか?もしそうなら、あなたはそれを良いコーディングの練習とみなしますか?派生クラスメンバを初期化するための基本クラスメソッドの使用

は、私は(必須ではない詳細は示されていない)、このような何かをしたい:

class ItemStorage { 
    int size() const; 
}; 

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

私は方法サイズが仮想でない場合、それはOKであることをかなり確信しています。それが仮想で、派生したクラスがそれを上書きしない場合はどうなりますか?

答えて

5

初期設定では、オブジェクトの初期化されていない部分にアクセスしないでください。項目が初期化されるときにItemStorageが既に初期化されているので、呼び出しサイズは実際には問題ありません。

サイズが仮想であっても、上書きされたとしても基本バージョンを呼び出すだけです(つまり、仮想メソッドは構築中のレベルにのみバインドされます)。

+0

+1:ItemStorageのコンストラクタが最初に呼び出されたことに気付かなかった。 – Puppy

+0

WOW。早く!どうもありがとう。 – watson1180

+0

ベースバージョンは、明示的に指定されているためにのみ呼び出されます。さもなければ、建設中のオブジェクトはSpecialStorageです。この場合、呼び出しは安全ではないかもしれません(まだ初期化されていないメンバーに依存します)。 – UncleBens

関連する問題