Ответ 1
Изменить: Есть серьезные редакционные проблемы по поводу этой должности, по-видимому. См. Раздел комментариев.
Немного обоим.
Философски, это работает - существуют классы, которые являются "реальным" строительным блоком для объектно-ориентированного программирования, и существуют структуры, которые представляют собой легкие типы данных для хранения, но позволяют использовать объекты метод вызывает знакомство и удобство.
Технически, "тип значения" означает, что вся структура - все ее содержимое - (обычно) хранится везде, где у вас есть переменная или член этого типа. В качестве локального параметра или параметра функции это означает, что в стеке. Для переменных-членов это означает, что они хранятся целиком как часть объекта.
В качестве (основного) примера того, почему наследование является проблемой, рассмотрите, как хранилище затронуто на низком уровне, если вы позволили структурам иметь подтипы с большим количеством членов. Все, что хранит этот тип структуры, будет занимать переменный объем памяти, основываясь на том, какой из подтипов он содержал, что было бы кошмаром распределения. Объект данного класса больше не будет иметь заданный размер во время компиляции, и то же самое будет верно для фреймов стека любого вызова метода. Этого не происходит для объектов, у которых есть хранилище, выделенное в куче, и вместо этого имеют ссылки на постоянное значение для этого хранилища в стеке или внутри других объектов.
Это просто интуитивное объяснение высокого уровня. См. комментарии и другие ответы для расширенной и более точной информации.