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

+0

WOW. БЫСТРО! Большое спасибо. – watson1180

+0

Он будет вызывать базовую версию только потому, что она явно указана. В противном случае объект под строительство - SpecialStorage, и в этом случае вызов может быть небезопасным (полагаясь на еще неинициализированных членов). – UncleBens

Смежные вопросы