C++ шаблоны наследование

[C++][Наследование][Шаблоны] wtf?

Помогите разобраться, почему защищенный член val не наследуется? (http://ideone.com/Qn17V)

Пост не читал, но первый же коммент — явно правильный.

Кстати, а с чем связано такое поведение? Вроде бы проблем с областью видимости быть не должно. Или это gcc-specific?

> Кстати, а с чем связано такое поведение?

Очень не удобно кстати Так и не понял утверждения: Since the definition of a dependent base class is not known at that time .

Ну ё-маё. Был такой же тред совсем недавно:

а что конкретно непонятно?

похоже пора писать местный faq по С++ 🙂

Да все непонятно ) Этож gcc поведение, другие компи сваривают

> Так и не понял утверждения: Since the definition of a dependent base class is not known at that time .

Определение класса еще не известно на данный момент, Далее по тексту указана причина: «there may be specialisations of the base class template that have not yet been seen».

www.linux.org.ru

C++ шаблоны наследование

Играют-играют роль при наследовании. И я бы не назвал это препроцессингом. =)

Если базовый шаблонный класс зависит от шаблонных параметров наследника.

. то что бы из наследника достучаться до полей предка нужно писать:
Иначе в предке они видны не будут. Будут использоваться глобальные (если есть).

Ок то видимо только для gcc. Студия так не думает. Вот интересно это Студия что-то расширила или это так в новом стандарте будет ?

Студия даже такое кушает:
А gcc нет. =)

Откуда: Odessa
Сообщений: 6200

И в C++98/03 и в драфте C++0X:

In the definition of a class or class template, if a base class depends on a template-parameter, the base class
scope is not examined during unqualified name lookup either at the point of definition of the class template
or member or during an instantiation of the class template or member.

Т.е. MS не по стандарту делает.
GCC тоже так делал до 3.4, а потом привел в соответствие со стандартом.

Хотя я честно говоря не вижу никаких проблем с поиском имени при инстанцировании шаблона.
Или в С++ запрещено при инстанцировании шаблона менять семантику идентификаторов в зависимости от параметров инстанцирования?

Ну вроде можно не только менять семантику. Благодаря специализации классов можно в базовом шаблонном классе. в зависимости от параметров шаблона предоставлять совершенно другие поля-члены. или вообще предоставить пустой класс. Или, например, остановить компиляцию когда нас не устраивают шаблонные параметры для базового класса.

Вопрос в том, что перед инстанцированием класса-наследника должен быть полностью определен класс-предок. По идеи ?! Так с чего бы там не поискать наследуемые поля (данные, методы) ?

Откуда:
Сообщений: 1571

Все как обычными классами. Откуда вас терзают такие сомнения не понятно. =)

Нюанс только с доступом к полям-членам наследника через this-> (или Base::) описан выше. Да и то, только если шаблонные параметры предка зависят от шаблонных параметров наследника.

В 2008/2010 все это есть. И находится на том же месте. New Project-> MFC Application и полетели.

Только в 2008 нет MFC Class Wizard-а, он возвращается в 2010. Плюс, там MFC обновленный — по виду интерфейса он напоминает студию 2008 и современный офис. Т.е. названия классов чуть другие (типа CFrameWndEx), а так тоже самое.

Откуда:
Сообщений: 812

Только, вроде, MFC не входит в бесплатную версию студии, но если у вас все лицензии. =)

www.sql.ru

С++ OO design: Наследование параметра шаблона

У меня есть цепочка наследования с базой, являющейся базовым классом. Я хочу иметь возможность написать шаблон класса, который наследует Base и может использовать другой базовый класс Base. Я мог бы использовать виртуальное наследование, но нашел другое решение. Я хотел бы знать, если это общий/значительный/законный дизайн класса:

Напишите шаблон класса, в котором параметром шаблона является его класс, т.е. он должен быть базовым или базовым классом. В конструкторе я могу использовать static assert, чтобы действительно убедиться, что пользователь не использовал какой-либо незаконный класс в качестве параметра шаблона.

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

РЕДАКТИРОВАТЬ. Чтобы быть уверенным, что я не смущаю вас, вот какой-то код:

Теперь я могу использовать Base или любой класс Base -derived, например. Derived , как параметр TheBase .

Это действительный шаблон проектирования. Это наследование mixin, а не CRTP. Наследование миксинов обеспечивает способ безопасного имитации множественного наследования программистом, вручную линеаризующим иерархию наследования. Шаблонные классы — это микшины. Если вы хотите расширить класс с несколькими миксинами, вам необходимо определить порядок композиции, например Big > . Программирование Mixin на С++ описано в этой статье Dr Dobb. Mixins можно использовать для реализации статической версии шаблона декоратора GoF, как описано здесь. Микшины играют роль simlar в С++, которые черты (а не С++-черты) играют в Scala и SmallTalk.

В CRTP это базовый класс, который является шаблоном:

Позднее редактирование: через год я пересматриваю свой собственный ответ. Я изначально ошибочно заявил, что шаблон OP размещен CRTP. Это неверно. Это действительно смесь, пожалуйста, прочитайте Даниэль Малер ниже на странице для правильного объяснения.

Оригинал: Это нормально использовать такой дизайн. WTL использует его, например. Он используется для реализации Статический полиморфизм и называется Любопытно повторяющийся шаблон шаблона

Это прекрасно, как указывает Задирион. Причина, по которой он работает (упрощен), заключается в том, что шаблоны на С++, в отличие от generics на С#, являются компиляцией. Было бы ошибкой сказать «это typedef», и я получил бы много хлопка для него, но пусть все будет просто и сказать, что это так.

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

Вот хороший девиз: Использовать шаблоны для типов, но наследование для поведения.

Придерживайтесь. Конечно, есть много коротких сокращений/трюков, которые вы могли бы использовать для выполнения этой работы, но в конечном итоге эти плохие варианты дизайна будут головными болями. Если вы хотите использовать их, обязательно изучите преимущества и недостатки.

Теперь, возвращаясь к вашему вопросу, вы можете сделать следующее: см. CRTP и Статический полиморфизм.

Похоже, вы говорите о Любопытно повторяющемся шаблоне шаблона, который является допустимым С++.

То, что вы пытаетесь сделать, это наследовать от двух классов, которые могут иметь общий базовый класс, это правильно? В этом случае вы столкнетесь с проблемами виртуального наследования (т.е. Вам придется объявить виртуальным наследование базового класса для обоих интересующих вас классов). Это может привести к незначительным (вероятно, незначительным) издержкам из-за некоторой поддержки во время выполнения (2 vpointers).

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

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

Я не совсем понял, что вы пытаетесь сделать, но если вы пытаетесь наследовать от двух разных классов с общим базовым классом (это виртуальное наследование — это все), и по какой-то причине вы не хотите для использования ключевого слова virtual, вы можете использовать CRTP следующим образом:

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

Более простое, возможно, более чистое, лучшее решение, если вы намереваетесь наследовать базу и базовый производный класс в одно и то же время:

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

если вы обратите внимание на разработку своего класса на потенциальное скрытие имен проблемы и просто используйте полиморфизм для «настройки» поведения функций, которые вы на самом деле хотите быть разными (и которые могут управляться с помощью управления), тогда чистая иерархия как Base -> Derived -> YourClass может в конечном итоге решить ваши проблемы.

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

qaru.site

Visual C++ Classes in Class Designer

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

Конструктор классов поддерживает классы C++ и отображает собственные классы C++ так же, как фигуры классов Visual Basic и Visual C#, за исключением того что классы C++ могут обладать отношениями множественного наследования. Для отображения полей и методов в классе можно развернуть фигуру класса или свернуть ее для экономии места.

Конструктор классов не поддерживает объединения (специальный тип класса, в котором память выделяется только по мере необходимости для объединения больших данных-членов).

При перетаскивании в схему классов более одного класса классы, имеющие отношения наследования, будут соединены стрелкой. Стрелка указывает в направлении базового класса. Например, если отобразить в схеме следующие классы, то они будут соединены стрелкой, указывающей от B к A:

Можно перетащить в схему классов только один класс B и просмотреть его базовые классы, щелкнув правой кнопкой мыши фигуру класса B и затем выбрав команду Показать базовые классы. Будет показан его базовый класс: A.

Конструктор классов поддерживает наглядное представление отношений множественного наследования классов. Множественное наследование используется, если у производного класса есть атрибуты более чем одного базового класса. Пример множественного наследования:

При перетаскивании в схему классов более одного класса появится стрелка, соединяющая классы, которые обладают отношениями множественного наследования. Стрелка указывает в направлении базовых классов.

Чтобы отобразить базовые классы выбранного класса, щелкните правой кнопкой мыши фигуру класса и затем выберите команду Показать базовые классы.

Команда Показать производные классы не поддерживается для кода C++. Чтобы отобразить производные классы, необходимо перейти в «Окно классов», развернуть узел типа, затем развернуть вложенную папку Производные типы и перетащить требуемые классы в схему классов.

Дополнительные сведения о множественном наследовании классов см. в разделах Множественное наследование и Несколько базовых классов.

Конструктор классов поддерживает абстрактные классы (также называемые «абстрактные базовые классы»). Из данных классов никогда не создаются экземпляры, но из них можно создать другие производные классы. Используя пример, приведенный в данном документе в разделе «Множественное наследование», можно создать экземпляр класса Bird как отдельный объект:

Однако нельзя создать экземпляр класса Swimmer как отдельный объект. Из него можно создать производные классы других типов классов животных, например Penguin , Whale и Fish . В данном случае класс Swimmer будет объявлен как абстрактный базовый класс.

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

Также можно объявить класс как абстрактный, включив по крайней мере одну чисто виртуальную функцию:

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

Класс, являющийся производным от абстрактного базового класса, должен переопределять каждую чисто виртуальную функцию в базовом классе, иначе невозможно будет создать экземпляр из производного класса. Например, если класс Fish является производным от класса Swimmer , класс Fish должен переопределять метод swim :

При отображении данного кода в схеме классов конструктор классов нарисует линию наследования от Fish к Swimmer .

Конструктор классов поддерживает анонимные классы. Классы анонимных типов — это классы, объявленные без идентификатора. У анонимных классов не может быть конструктора или деструктора, они не могут быть переданы в качестве аргументов и не могут быть возвращены так же, как возвращаются значения из функций. Анонимный класс можно использовать для замены имени класса именем typedef, как показано в следующем примере:

Структуры также могут быть анонимными. Конструктор классов отображает анонимные классы и структуры таким же образом, как отображает соответствующие типы. Несмотря на то что можно объявить и отобразить анонимные классы и структуры, конструктор классов не будет использовать указанное пользователем имя тега. Он будет использовать имя, которое создаст «Окно классов». Класс или структура отображаются в «Окне классов» и «Конструкторе классов» как элементы с именем __unnamed.

Дополнительные сведения об анонимных классах см. в разделе Типы анонимных классов.

Конструктор классов поддерживает визуализацию классов-шаблонов. Вложенные объявления поддерживаются. В следующей таблице представлены некоторые объявления:

msdn.microsoft.com

Объектно-ориентированное программирование (Учебное пособие). Автор: Шахгельдян К.И. , редактор: Александрова Л.И.

Параметризованные типы могут повторно использоваться, благодаря наследованию. Это сравнимо с использованием наследования при порождении обычных классов. Как шаблоны, так и наследование представляют собой механизм для повторного использования кода и могут включать полиморфизм. Они – отличительные особенности С++ и поэтому могут комбинироваться в различных формах. Класс-шаблон может быть порожден от обычного класса. Обычный класс может быть порожден от класса-шаблона. Каждая из этих возможностей ведет к различным отношениям.

Обычный класс порождается от созданного на базе шаблона класса.

class D: public C < /*…*/ >

Шаблон может быть порожден от не шаблона

template class vect_safe: private vect <>;

Создадим шаблон от другого шаблона.

template class vector < /* … */ >;

template class Vec: public vector <>;

Класс или шаблон класса может иметь члены, которые сами являются шаблонами. Например :

template class complex <

template complex(const complex &c):

complex cd = cf ; //правильно, используется преобразование float в double .

complex a=b; // неправильно

Можно создавать complex из complex , если определенно преобразование T 2 в T 1 .

Два класса, сгенерированные из одного шаблона, не связаны никакими отношениями. Например :

class Circle: class Shape <>

Часто рассматривают множество окружностей set как множество форм set . Аргумент при этом следующий: раз окружность Circle это форма Shape , то множество окружностей – это множество форм, и, следовательно, можно обращаться с set как с set .

На самом деле этого делать нельзя, поскольку множество объектов типа Shape гарантирует, что в множестве объектов содержатся формы, но не окружности. Например :

class Triangle: public Shape < >;

f ( s ); // ошибка несоответствия типов ( и это правильно! в множество окружностей не стоит вставлять треугольники)

abc.vvsu.ru

Смотрите еще:

  • Узаконенные единицы измерения Единицы физических величин Представлены все метрологические термины и определения понятия единицы физических величин 4.1. Единица измерения физической величины; единица измерения;единица величины;единицаde […]
  • Тхэквондо итф правила Тхэквондо итф правила НАШИ ДРУЗЬЯ http://www.taekwondo-itf.ru http://www.tkd-sochi.ru http://www.tkditf.ru ПРАВИЛА ТАЭКВОНДО (ITF) Тхэквондо в версиях разных федераций имеет различия в правилах […]
  • Правила салонного макияжа Работа визажиста в салоне красоты Как должен выглядеть визажист? Какими навыками и умениями должен обладать? Как должен общаться с клиентом? И еще очень много вопросов у тех, кого интересует эта профессия. […]
Закладка Постоянная ссылка.

Обсуждение закрыто.