Как сказал Бьярн, контроль доступа в C ++ предназначен для защиты от Мерфи, а не от Макиавелли. То же самое и в целом - его функции предназначены для защиты от несчастных случаев, а не для того, чтобы люди намеренно делали что-то не так.
В некоторой степени использование C ++ означает хотя бы некоторую степень доверия к другим людям, которые будут иметь доступ к вашему исходному коду. Если они захотят достаточно сильно, они могут облажаться всеми способами, и вы ничего не сможете сделать, чтобы их остановить. Если вы хотите наложить реальные ограничения на использование вашего кода, C ++ - неподходящий язык для ваших целей.
Изменить: это вообще не «аргумент» - это просто указание на основу, на которой были приняты решения. Поскольку у меня есть копия D&E после ответа на предыдущий вопрос, я напечатаю немного больше, если она здесь 1:
Гораздо важнее разрешить полезную функцию, чем предотвратить любое неправильное использование: Вы можете писать плохие программы на любом языке. Важно свести к минимуму вероятность случайного неправильного использования функций, и было потрачено много усилий на то, чтобы гарантировать, что поведение конструкций C ++ по умолчанию является разумным или приводит к ошибкам во время компиляции. Например, по умолчанию проверяются все типы аргументов функции - даже через отдельные границы компиляции - и по умолчанию все члены класса являются закрытыми. Однако язык системного программирования не может помешать решительному программисту сломать систему, поэтому усилия по проектированию лучше направить на создание возможностей для написания хороших программ, чем на предотвращение неизбежных плохих. В долгосрочной перспективе программисты, кажется, учатся. Это вариант старого слогана C «Доверься программисту». Существуют различные правила проверки типов и контроля доступа, позволяющие провайдеру класса четко указывать, что ожидается от пользователей, для защиты от несчастных случаев. Эти правила не предназначены для защиты от преднамеренного нарушения (§2.10).
В §2.10 он, среди прочего, говорит:
Задача системы защиты - убедиться, что любое такое нарушение системы типов является явным, и минимизировать необходимость в таких нарушениях.
Эти цели здесь, похоже, были достигнуты - публикация защищенного члена базового класса определенно требует явных действий в производном классе, и за более чем 20 лет написания C ++ я не могу припомнить, чтобы когда-либо нуждался (или даже хотел) в этом.
1 §4.3, стр. 115, 116.
person
Jerry Coffin
schedule
27.01.2010