Наследование структур без функций-членов - PullRequest
0 голосов
/ 19 марта 2012

Этот вопрос, вероятно, является вопросом "что говорит стандарт C ++", но мой поиск в Google не дал мне ответа, который я ищу.

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

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

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

Ответы [ 2 ]

1 голос
/ 19 марта 2012

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

1 голос
/ 19 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...