Первый раз столкнулся, по моему мнению, с непонятным поведением:
class base
{
protected:
int x;
public:
base() : x(0) {}
};
class derived : public base
{
pubic:
derived() : x(0) { }
// error C2614: 'derived' : illegal member initialization: 'x' is not a base or member
};
Почему ???
class base
{
protected:
int x;
public:
base() : x(0) {}
};
class derived : public base
{
public:
derived()
{
x = 0; // а так без проблем
}
};
Почему ???
Здравствуйте, Чили, Вы писали:
Ч>Первый раз столкнулся, по моему мнению, с непонятным поведением:
Ч>
Ч>class derived : public base
Ч>{
Ч>pubic:
Ч> derived() : base(), x(0) { }
Ч> // error C2614: 'derived' : illegal member initialization: 'x' is not a base or member
Ч>};
Ч>Почему ???
Потому что на самом деле твой код выглядит так (смотри выделенное выше) — вначале инициализируется база со всеми своими членами, включая х, а потом члены производного класса. А ты пытаешься инициализировать х повторно, хотя он уже был инициализирован конструктором базы.
С инициализированным объектом ты можешь сделать только одно — присваивание в теле конструктора.
Здравствуйте, Чили, Вы писали:
Ч>Первый раз столкнулся, по моему мнению, с непонятным поведением:
Ч> class base
Ч>{
Ч>protected:
Ч> int x;
Ч>public:
Ч> base() : x(0) {}
Ч>};
Ч>class derived : public base
Ч>{
Ч>pubic:
Ч> derived() : x(0) { }
Ч> // error C2614: 'derived' : illegal member initialization: 'x' is not a base or member
Ч>};
Ч>Почему ???
Так надо. Это же инициализация, а не присваивание. Инициализация должна/может делаться ровно один раз, и раз она может осуществляться в конструкторе base, то больше ниоткуда ее выполнять не разрешено.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Чили, Вы писали:
Ч> class base
Ч>{
Ч>protected:
Ч> int x;
Ч>public:
Ч> base() : x(0) {}
Ч>};
Ч>class derived : public base
Ч>{
Ч>pubic:
Ч> // derived() : x(0) { } - абсолютно излишняя строчка. За инициализацию члена x отвечает класс base.
// Инициализация x будет выполнена в конструкторе base, который будет вызван ДО констуктора derived - см. Стандарт, 12.6.2.
Ч>};