2012-03-18 2 views
0

Этот вопрос, скорее всего, означает «что говорит стандарт C++», но мой поиск в Google не дал мне ответа, который я ищу.Наследование структур без функций-членов

Я знаю, что когда у вас есть классы и у вас есть один класс, наследуемый от другого класса, вы попадаете в мир виртуальных таблиц функций, поскольку код должен определить, какой класс содержит функцию, которую вы пытаетесь вызвать ,

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

В конечном счете, я хочу, чтобы мои данные были простыми и непрерывными, поскольку основная структура была бы, и я не знаю, может ли наследовать данные.

ответ

1

В модели памяти C++ объект всегда располагается в непрерывной памяти. Вы должны использовать элементы, указывающие на данные вне этого объекта, если вы хотите иметь несмежную память. То есть, если вы наследуете какой-либо класс, является ли он структурой или имеет виртуальную функцию, фактический объект всегда смежный. Есть несколько других последствий для типов, которые могут быть заинтересованы: если класс является стандартным типом макета, вы можете, например, memcpy() объект. Я не уверен, что C++ 2011 говорит о наследовании и стандартном типе макета, но я уверен, что C++ 2003 не разрешил наследование, а C++ 2011 позволяет это.

1

знает, что когда у вас есть классы, и у вас есть один класс наследует от другого класса, вы попадаете в мир таблиц виртуальных функций

только если у вас есть виртуальные функции ...

, чтобы ответить на ваш вопрос: если у вас есть простой struct без функций-членов, тогда компилятор не будет генерировать таблицу виртуальных функций.

и BTW вы не должны беспокоиться об этом, эта таблица относится к классу, и вам нужен только простой дополнительный указатель на один экземпляр (если вы используете простое наследование).

+0

Очень верно. Я упомянул об этом как пример того, что происходит за кулисами, когда вы используете наследование. Я не знаю, есть ли какие-то подобные вещи, которые происходят за кулисами для членов данных. – Nairou

+1

@Nairou: Нет, нет, потому что члены данных не являются полиморфными. –

Смежные вопросы