Блог

Задача c++ наследование

Задача на классы — Наследование, виртуальные методы и прочая прелесть

Key Words for FKN + antitotal forum (CS VSU):

  • Log in to post comments
  • 4324 reads

Fri, 05/17/2013 — 23:09

мысли по решению

1) произвольное множество и методы работы с ним опишем с помощью базового класса и его наследников (наследники — для различных типов данных, содержащихся в множестве — для которых придется менять часть методов).
2) само множество может представлять собой линейный список (необходимо когда данные разных типов в одном множестве) или массив (для одного типа). наверно, терпения у меня не хватит и я сделаю только с массивом.
3) методы, которые будут меняться в наследниках, объявим виртуальными.
о виртуальных методах и полиморфизме: http://programmersclub.ru/38/
про статические методы и элементы : http://www.c-cpp.ru/books/staticheskie-c.

  • Log in to post comments

Sat, 05/18/2013 — 11:30

множества вполне могут быть

множества вполне могут быть реализованы на основе массивов.

_____________
матфак вгу и остальная классика =)

  • Log in to post comments

Sat, 05/18/2013 — 21:04

массивы — списки

это мне известно)) так я и собираюсь сделать — так проще
но препод поощряет создание еще одной реализации — по спискам.
по условию вообще надо и так и этак.
базовый класс (чьи интерфейсные методы будут наследоваться классами конкретных вариантов множеств) построен на следующем скелете:

про непонятную конструкцию типа template и про шаблончики читаем тут http://programmersclub.ru/29/

  • Log in to post comments

Sun, 05/19/2013 — 13:12

ничтоже сумняшеся

для начала я решил сделать все это в одном классе на массиве — без всяких виртуалок и наследования — дабы мозги излишне не грузить всей задачей сразу и потренироваться.
код класса:

Доступно про наследование в С++

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

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

С этим классом должно быть все понятно. Его объекты будут характеризоваться одним параметром » health » (здоровье) и есть один метод, позволяющий вывести значение этого параметра на экран. Можно создавать фермеров:

На экран выведется Unit health: 10 и Unit health: 30. Ничего нового пока.

Теперь создадим воинов. Кроме того, что у них есть здоровье, как у фермеров, они могут наносить урон ( damage ). Можно было бы создать отдельный класс для воинов с параметрами health и damage , но гораздо проще создать класс воинов, имеющий параметр health класса фермеров и свой параметр damage . Это и есть наследование:

То есть теперь, создавая объект класса Soldier , можно использовать как его поля, так и поля базового класса Unit :

В результате у Геракла теперь 10 healthи 30 damage, а у Ахиллеса 40 healthи 50 damage. Сейчас я поясню несколько моментов, которые могли вызвать затруднения, но сначала необходимо изменить метод доступа поля health класса Unitс privateна protected, чтобы код скомпилировался. protectedотличается отprivateтем, что protectedне запрещает доступ к полям классам-наследникам.

Другие публикации:  Получение разрешения пожарной инспекции

Теперь о моментах:
-при объявлении класса-наследника необходимо представить базовый класс:
class Soldier : public Unit
-при объявлении базового класса необходимо предоставить модификатор доступа (public, private, protected) перед именем базового класса. Модификаторpublic позволяет классу-наследнику наследовать поля базового класса так, как они объявлены в базовом классе, protectedпреобразует public в protected, а модификатор privateнаследует поля базового класса, как private, вне зависимости от того, как они заданы в базовом классе. Следует отметить, что наследование ни как не изменяет базовый класс
-в представленном наследнике, для примера, введено несколько конструкторов. При создании объекта класса Soldier, в случае первых двух конструкторов для инициализации полей базового класса Unitбудет использоваться его конструктор по умолчанию. Третий же конструктор Soldier вызывает конструктор с параметром базового Unit

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

Все лошади будут иметь 10 healthи 20 speed.

А теперь создадим всадников, которые будут иметь характеристики как фермеров(здоровье) и солдат (damage), так и лошадей (speed):

И все бы ничего, но наследуя и Horseи Soldier, Horsemanнаследует 2 копии Unit. Решить эту проблему можно использовав ключевое слово virtualперед объявлениями о наследовании класса Unit(не путайте с виртуальными функциями):

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

Допустим, что солдат тоже может двигаться (имеет параметр speed):

Неоднозначность можно решить дважды использовав оператор разрешения контекста:

Но правильнее было бы переназначить поле в классе Horseman (код целиком):

Если Вам понравилась статья, проголосуйте за нее

Голосов: 0 Голосовать

Задача c++ наследование

Здравствуйте!
Раньше я проектировал, создал класс некоторых объектов и класс, управляющий этими объектами

Познее появились разновидности объектов

Можно ли как нибудь изменить CObjectManager, чтобы в одном случае из CObjectManager можно было вызывать f1, а вдругом — f2.

CSubObject1 и CSubObject2 уже сильно различаются, а основу управления ими менять не хочется. Единственное, что пока мне пришло на ум — это static_cast.

Здравствуйте Constructor, Вы писали:

C>Здравствуйте!
C>Раньше я проектировал, создал класс некоторых объектов и класс, управляющий этими объектами
.
Несовсем понятен вопрос,

Выносишь все управляющие функции в базовый класс (CObj) они должны быть виртуальными или в случае, когда в потомках они должны быть переопределены «чисто виртуальными». из CObjectManager дергаешь только их. В каждом классе определяешь «чисто виртуальные функции». Ты же сам это писал. Если в зависимости от ситуации виртуадльная функция должна выполнять совершенно разные действия, то один из варианьлв:
enum STATE ;

Здравствуйте Constructor, Вы писали:

C>Здравствуйте!
C>Раньше я проектировал, создал класс некоторых объектов и класс, управляющий этими объектами
C>

C>Познее появились разновидности объектов
C>

C>Можно ли как нибудь изменить CObjectManager, чтобы в одном случае из CObjectManager можно было вызывать f1, а вдругом — f2.
C>

C>CSubObject1 и CSubObject2 уже сильно различаются, а основу управления ими менять не хочется. Единственное, что пока мне пришло на ум — это static_cast.

Вообще-то, раз ты сделал f() в CObject виртуальной, то по логике вещей, ее и надо переопределять в наследниках. Тогда проблема автоматом снимается за счет полиморфизма. Если же f() в наследниках уже переопределена и используется для других целей, то введи в интерфейс родительского класса другую виртуальную функцию и ею рули. Типа так:

И тогда ObjectManager.m_pObjects[0].anoter_f() будет вызывать то что надо.
Кстати, непонятно что ты хотел сказать этим кодом:

Другие публикации:  Системные требования lost

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

Здравствуйте Gosha, Вы писали:

G>Вообще-то, раз ты сделал f() в CObject виртуальной, то по логике вещей, ее и надо переопределять в наследниках. Тогда проблема автоматом снимается за счет полиморфизма. Если же f() в наследниках уже переопределена и используется для других целей, то введи в интерфейс родительского класса другую виртуальную функцию и ею рули. Типа так:

G>
G>И тогда ObjectManager.m_pObjects[0].anoter_f() будет вызывать то что надо.

А вот в MFC есть шаблонный класс CTypedPtrList. Когда определяешь свой класс, в параметрах шаблона указываешь базовый класс и тот класс, для которого хочешь сделать список. Нельзя ли в данном случае сделать что-то подобное?

anoter_f() конечно, можно объявить, но у меня эта anoter_f() в разных случаях будет делать совершенно разные операции, да может получиться, что в CSubObject1 и в CSubObject2 потребуется разное число таких anoter_fi().

G>Кстати, непонятно что ты хотел сказать этим кодом:
G>
G>Тут либо ошибка в индексах элементов вектора (они на самом деле не одинаковые), либо вообще не понятно, как ты собирался вызывать для одного и того же объекта (чей указатель хранится в векторе) методы, присущие разным классам

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

Тема: Наследование. Задача

тема Наследование правильно ли я вызываю диструктор
Всем Здравствуйте. Я не уверен правильно ли я вызываю диструктор employee в.

Тема. Полиморфизм. Задача
В программе выполнены следующие описания: class A < protected: int a;.

Задача в С++. ТЕМА : ОПЕРАЦИИ СО СТРОКАМИ
ТЕМА : ОПЕРАЦИИ СО СТРОКАМИ Напишите программу, которая вставляет символ.

Задача на числовое наследование
Для этой задачи использовалась картинка в архиве. Вот код который у меня.

Задача на связность объектов и наследование
Добрый вечер. Помогите с задачей. Нужно написать классы Товар — Категория -.

Задача c++ наследование

Прошу помочь разобраться с задачей о наследовании классов.
Необходимо по графу построить иерархию классов:

-каждый класс должен иметь целочисленное свойство
Пример: int a ( целочисленное свойство класса А)

-каждый класс должен иметь инициализирующий конструктор
Пример : A(int x)

-ГЛАВНОЕ: каждый класс должен иметь ПЕРЕГРУЖЕННЫЙ ОПЕРАТОР для вывода значений всех свойств в поток вывода.
Пример: A operator *= (A&)

Задание приложено графическим файликом. Заготовка кода написана ниже. Заранее спасибо.

Наследование классов в C++ — урок 13

Создание базового класса

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

Создайте файл human.h :

Наследование от базового класса

Теперь создайте новый класс student , который будет наследником класса human . Поместите его в файл student.h .

Функция get_average_score вычисляет среднее арифметическое всех оценок студента. Все публичные свойства и методы класса human будут доступны в классе student .

Конструктор базового класса

Для того, чтобы инициализировать конструктор родительского класса (в нашем случае — это сохранение имени, фамилии и отчества ученика), используется следующий синтаксис:

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

Список оценок студента хранится в векторе.

Другие публикации:  Исковое заявление о взыскание неустойки по алиментам

Создание объекта класса student

Реализуем пользовательский интерфейс для работы с классом student .

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

После инициализации объекта, происходит вывод полного имени студента с помощью функции get_full_name . Эта функция была унаследована от базового класса human .

Затем программа вычислияет средний балл студента и выводит его на экран. Этим занимается функция get_average_score , которую мы описали внутри класса student .

Мы реализовали часть функционала для нашей базы данных института (я конечно утрирую, когда оперирую столь серьезными высказываниями про настоящую базу данных 🙂

Создание класса-наследника teacher

Нужно создать еще один класс, в котором будут храниться данные преподавателей. Дадим ему название — teacher . Как вы уже поняли, мы не будем описывать все методы этого класса с нуля, а просто унаследуем его от класса human . Тогда, не нужно будет реализовывать хранение имени, фамилии и отчества препода. Это уже есть в базовом классе human .

Создайте файл teacher.h :

У класса teacher появилось новое свойство — количество учебных часов, отведенное преподавателю на единицу времени (семестр). Весь остальной функционал наследуется от базового класса human . Если бы мы писали все с нуля, то одинакового кода бы получилось в разы больше, и его поддержка усложнилась бы на порядок.

Создание объекта класса teacher

Изменим содержимое файла main.cpp , чтобы проверить работу класса teacher .

Если сборка программы прошла без ошибок, то результат работы программы будет таким:

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

Также, мы можем создать класс, который будет описывыть студента заочной формы обучения. Его мы унаследовали бы от класса student , добавив какие-либо дополнительные данные.

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

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

Когда нужно использовать конструктор

Если у класса много свойств — их совсем не обязательно задавать в конструкторе. Для сохранения отдельных свойств класса используют set-функции. Например, для сохранения номера паспорта, можно создать публичный метод set_passport_number(std::string number) , который будет принимать значение свойства и сохранять его в объекте, через переменную this .