Вопрос о защищенных членах в наследстве - PullRequest
1 голос
/ 10 марта 2011

Я считаю, что защищенные члены доступны через наследование классов. Итак, в чем заключается моя ошибка в мыслительном процессе, когда я считаю, что это нормально?

У меня есть класс еды и овощей, где Вегас наследует от еды. Пища имеет защищенного члена в возрасте; В конструкторе Veg я пытаюсь инициализировать возраст до 0. Почему это недопустимо?

Какой-то код ...

Veg::Veg():age(0)
{
    cout << "Veg constructor." << endl;
}

class Veg : public Food
{
//snip
};

class Food
{
//snip
protected:
    int age;
};

Ответы [ 2 ]

7 голосов
/ 10 марта 2011

В списке инициализации конструктора для класса C вы можете только инициализировать

  1. прямые базовые классы класса C,
  2. виртуальные базовые классы классаC и
  3. нестатические члены данных класса C.

Если вы хотите инициализировать элемент данных базового класса, вам нужно сделать это либо всписок инициализации конструктора базового класса или в теле конструктора производного класса.Вы не можете сделать это в списке инициализации конструктора производного класса.

2 голосов
/ 10 марта 2011

так были разработаны списки инициализации; класс, который объявляет член, отвечает за инициализацию в этом случае.

как правило, это преодолевается тем, что Food указывает возраст в качестве аргумента в конструкторе:

Food::Food(const int& inAge) : age(inAge) {}
Veg::Veg() : Food(-1) {}

хотя, вы все равно можете получить доступ к возрасту в теле мертвеца, если защищены:

Veg::Veg() : Food() {this->age = -1;}

если бы это было не так, то вы бы построили age дважды, что часто имеет значение, когда тип age является чем-то более сложным, чем int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...