Итак, теперь структура может иметь виртуальную функцию и поддерживать наследование? Какая тогда разница с классами? Какова истинная цель сокрытия информации?

Возможный дубликат:
В чем разница между структурой и классом в C ++

http://www.cplusplus.com/reference/std/typeinfo/type_info/ < / а>

Думаю, мой «учитель» мало что сказал мне о различиях между структурами и классами в C ++.

Я читал в другом вопросе, что в отношении наследования структура по умолчанию является общедоступной ... Я также предполагаю, что у структуры нет конструкторов / деструкторов ...

В чем тогда еще отличия? Они так важны?

И когда речь идет о частных / защищенных атрибутах / методах, они недоступны во время выполнения только потому, что компилятор сообщает об этом во время компиляции и сообщает об ошибке, верно? Затем, сравнивая эти функции с классами, что на самом деле дает программисту «сокрытие информации»? Это здесь, чтобы, когда кто-то повторно использует класс, этот человек не будет злоупотреблять классом, потому что частные / защищенные данные будут сообщены компилятором?

Я все еще борюсь с реальной целью сокрытия информации, мне все еще хочется звучать в моей голове, как будто это обеспечивает больше безопасности в программах, что означает меньшее количество нарушений безопасности, но я действительно сбит с толку целью такого дизайна в языке ... (И я никоим образом не собираюсь выступать против C ++, я просто хочу понять, в каких случаях эта функция может быть интересной или нет; если нет, это не проблема, но мне просто хотелось бы знать ...).


person jokoon    schedule 02.10.2010    source источник
comment
и ваш другой вопрос является возможным дубликатом Как объяснить новому программисту слабую связь и сокрытие информации? и Абстракция VS Скрытие информации VS инкапсуляция. Кстати, старайтесь задавать один вопрос в каждом посте.   -  person Péter Török    schedule 02.10.2010
comment
Это похоже на два отдельных вопроса. Задайте их по отдельности (или, конечно же, прочтите вопросы, которые они дублируют)   -  person jalf    schedule 02.10.2010
comment
Третий кусок головоломки: вы можете создавать объединения классов и структур (если у них нет ctor / dtor, но у объединения может быть ctor.   -  person slashmais    schedule 04.10.2010


Ответы (1)


Что касается компилятора, нет никакой разницы между struct и class, кроме доступности по умолчанию. Это всего лишь два разных ключевых слова для определения одного и того же. Итак, у структур могут быть конструкторы, деструкторы, базовые классы, виртуальные функции, все что угодно.

Что касается программистов, обычно используется struct для классов, не имеющих ничего из этого (в частности, которые являются POD), или пойти еще дальше и использовать struct только для классов без каких-либо определяемых пользователем функций-членов вообще, только с общедоступными элементами данных. Люди иногда портят это соглашение, потому что на удивление легко думать, что класс является POD, хотя это не так, но, по крайней мере, они пытаются.

По крайней мере, в C ++ сокрытие информации не имеет ничего общего с безопасностью. Выбрось это прямо из головы. Он не обеспечивает никакой безопасности, за исключением того же общего способа, которым любая хорошая практика кодирования делает код, о котором легче думать, и, следовательно, программисты делают меньше ошибок.

Цель сокрытия информации - позволить вам изменить реализацию позже, возможно, удалить или переименовать закрытые члены, будучи уверенным в том, что ни один из пользователей вашего класса, за пределами самого класса и друзей, не ссылается на них. Очевидно, что это полезно, но менее очевидно и, возможно, более важно, это полезно, потому что оно явно указывает в коде, что такое интерфейс вашего класса, что вы хотите использовать клиентами и что пользователи вашего класс по праву может рассчитывать на работу. Вы можете добиться того же в принципе с помощью документации, но на практике компилятору приятно применять правила.

Это не «безопасно», потому что на любом данном компиляторе можно обойти публичную / частную защиту. Но если пользователи вашего класса делают это, они используют какой-то гротескный хакер, они заслуживают того, чтобы их код перестал компилироваться / работать, когда вы меняете свой класс, и если они придут к вам пожаловаться, вы можете посмеяться над ними.

person Steve Jessop    schedule 02.10.2010
comment
@ Стив: Хороший ответ. +1 :) - person Prasoon Saurav; 02.10.2010
comment
Это очень маленькие преимущества ... И я до сих пор не понимаю, какова цель наследования, когда вы можете просто создать объект из другого класса внутри него ... ООП - действительно мой кошмар программирования ... Когда я думаю о скорости кода и объем памяти, я до сих пор не могу понять, в чем цель, кроме как сделать источник более реалистичным ... - person jokoon; 02.10.2010
comment
@gokoon: вы не спрашивали о цели наследования, это совсем другой вопрос, связанный с целью сокрытия информации. Однако я бы посоветовал вам перестать много думать о скорости кода и объеме памяти. Мой компьютер имеет примерно в 10-100 раз больше скорости и памяти, которые мне обычно требуются, поэтому я могу позволить себе довольно много в обмен на источник, с которым легче работать. В необычных случаях, когда скорость или использование памяти в 10 раз меньше опасной зоны, вы тратите много времени на размышления об этом. В остальное время просто избегайте совершенно неподходящих алгоритмов и структур. - person Steve Jessop; 02.10.2010
comment
И мне очень жаль, я не понимаю, что вы имеете в виду, вы можете просто создать внутри него объект из другого класса. - person Steve Jessop; 02.10.2010
comment
в программировании игр скорость - это какое-то жизненно важное значение ... может быть, я еще не на уровне создания игры с большим количеством требований к процессору, но я думаю об этом ... - person jokoon; 02.10.2010
comment
Я имел в виду struct a; struct b {a A; }; здесь объект находится внутри, но вместо этого я мог бы сделать struct b: public a {}; просто унаследовать от ... Я могу делать и то, и другое, и я не могу найти никаких преимуществ ... - person jokoon; 02.10.2010
comment
Как ни странно, многие высокопроизводительные игры пишут значительный объем кода на lua, который является объектно-ориентированным языком сценариев, который обычно запускается в интерпретаторе в игре. В необычных случаях, требующих высокой производительности (физический движок, обработка графики), они взламывают C ++ или такие вещи GPU, как конвейеры шейдеров, которые я не понимаю. - person Steve Jessop; 02.10.2010
comment
@gokoon: что касается интеританса и встраивания, основное различие заключается в том, хотите ли вы, чтобы ваши объекты типа b на самом деле были тем, что представляет a, или вы просто хотите, чтобы они имели / использовать объект типа a. Например, если a равно std::fstream, то является ли ваш класс b определенным типом файлового потока (наследование) или просто у него есть файловый поток, который он использует для какой-то цели (встраивание)? - person Steve Jessop; 02.10.2010
comment
Не понимаю иронии ... - person jokoon; 03.10.2010
comment
Что ж, юмористическое несоответствие. В то время как вы беспокоитесь о накладных расходах C ++, программисты других игр выкидывают огромное количество кода, который намного менее эффективен во время выполнения. На самом деле, причина, по которой они это делают, заключается в том, что опытные разработчики могут сосредоточить свое время на оптимизации нескольких важных битов, вместо того, чтобы распылять свои усилия, беспокоясь о всей кодовой базе. Даже индивидуальный разработчик должен поступить так же: большая часть кода не нуждается в оптимизации. - person Steve Jessop; 03.10.2010
comment
Я имел в виду, что когда вы реализуете код, вы отвечаете на проблему с помощью решения. Вот что такое программирование. Что меня беспокоит, так это то, что встраивание или наследование - это просто дизайн или философский выбор, а не программирование. Кроме того, полиморфизм на самом деле не является функцией, если вам постоянно требуется приводить указатели на объекты. - person jokoon; 24.03.2012
comment
@jokoon: вы не должны приводить указатели на объекты. Если да, значит, вы неправильно делаете полиморфизм. - person Mooing Duck; 03.05.2016
comment
Как же так? Как не забрасывать при использовании полиморфизма? - person jokoon; 05.05.2016