2010-12-14 115 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

相关问题