Разрыв наследования нарушает инкапсуляцию в C ++ - PullRequest
3 голосов
/ 25 января 2012

Я читал (Скотт Майерс), что наследование нарушает инкапсуляцию.Когда данные / внутренние методы являются частными (не защищенными), нарушена ли инкапсуляция?

например,

class Vehicle
{
  int color;

public:
  void set_color();
  int get_color();
}


class Car: public Vehicle
{
public:
  void change_tires();
}

Я могу изменить внутренние компоненты автомобиля, не ломая машину, зная, правильно?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Фразы типа "инкапсуляция разрывов наследования" часто вырываются из контекста.

Фраза относится к тому факту, что наследуемый виртуальный интерфейс теперь не инкапсулирован. По сути, наследование означает, что некоторые вещи, которые были скрыты, теперь открыты. Такие вещи как protected члены и virtual private члены открыты для игры производными классами.

Non- virtual private участники по-прежнему скрыты.

0 голосов
/ 25 января 2012

Ну, я не знаю, что сказал Скотт Майерс, но, в любом случае, если вы сделаете так, как вы указали, метод car может получить доступ только к открытым методам и свойствам Vehicle точно так же, как если бы вы создали объект Vehicle. (нет защищенных методов и свойств), поэтому здесь нет нарушения разбиения, только если базовый класс не инкапсулирован правильно. Вы сможете изменить цвет автомобиля только с помощью метода set_color (...), поскольку int color является приватным (свойства класса и функции являются приватными, если не указано).

...