2014-01-13 4 views
3

У меня есть эта иерархия:Наследования безопасность конструкторы в C++

struct Params { int k = 17; }; 
struct A 
{ 
    A(Params& par): _p(par) 
    { } 

    Params& _p; 
}; 

struct B: public A 
{ 
    using A::A; 
    int c{this->_p.k}; 
}; 

int main() 
{ 
    Params p; 
    B b(p); 
    return 0; 
} 

Может ли я быть уверен, что A::_p всегда будут инициализированы перед вызовом его в объявлении B::c?

Спасибо!

+1

Да, 'A :: _ p' исходит из базового класса, поэтому его необходимо инициализировать до того, как производный класс начнет строить. – DanielKO

+0

Спасибо! Вы должны сказать это как ответ! –

ответ

3

Да, это будет инициализировано.

Базовый класс должен быть полностью построен до того, как производный класс начнет строиться. До тех пор, пока конструктор из A инициализируется A::_p, производные классы всегда * видят его полностью инициализированным.

[*] Конечно, с достаточным усилием вы всегда можете сломать вещи; например: http://coliru.stacked-crooked.com/a/196a5b0217efbbb1 Там я использовал оператора запятой, чтобы позвонить B::foo(), прежде чем что-либо можно будет построить; к счастью, компилятор обнаружил это как предупреждение.

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