Инициализация данных класса при наследовании
От: Чили Россия  
Дата: 18.01.10 08:51
Оценка:
Первый раз столкнулся, по моему мнению, с непонятным поведением:
 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
};

Почему ???
Re: Инициализация данных класса при наследовании
От: Чили Россия  
Дата: 18.01.10 08:57
Оценка:
class base
{
protected:
    int x;
public:
    base() : x(0) {}
};
class derived : public base
{
public:
    derived()
    {
        x = 0;    // а так без проблем
    }
};

Почему ???
Re: Инициализация данных класса при наследовании
От: jazzer Россия Skype: enerjazzer
Дата: 18.01.10 09:01
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>Первый раз столкнулся, по моему мнению, с непонятным поведением:

Ч>
 
Ч>class derived : public base
Ч>{
Ч>pubic:
Ч>    derived() : base(), x(0) { }
Ч>    // error C2614: 'derived' : illegal member initialization: 'x' is not a base or member
Ч>};

Ч>Почему ???

Потому что на самом деле твой код выглядит так (смотри выделенное выше) — вначале инициализируется база со всеми своими членами, включая х, а потом члены производного класса. А ты пытаешься инициализировать х повторно, хотя он уже был инициализирован конструктором базы.
С инициализированным объектом ты можешь сделать только одно — присваивание в теле конструктора.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Инициализация данных класса при наследовании
От: Тот кто сидит в пруду Россия  
Дата: 18.01.10 09:03
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>Первый раз столкнулся, по моему мнению, с непонятным поведением:

Ч>
 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Инициализация данных класса при наследовании
От: Vlad_SP  
Дата: 18.01.10 09:05
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>
 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.
Ч>};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.