Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95

Не могу сделать полиморфизм. Не могу до конца понять пример по этому поводу

04.05.2017, 16:56. Показов 2232. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая задача:
Класс Animal должен быть абстрактным, имеет имя и вес.
Класс Reptile имеет habitate, который держит в себе среду обитания животного.
Класс Snake имеет poisonous, который показывает животное ядовитое или нет.

Вобщем суть такова, что функция showInfo() должна перезаписывается через наследование. Эта функция должна предоставить информации о животных.

Вот, что на данный момент имею:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
using namespace std;
 
class Animal
{
    protected:
              string animalName;
              float weightAnimal;
    public:
        inline void setAnimal(string, float);
        virtual void showInfo()=0;
        virtual ~Animal() = default;
};
 
class Reptile: public Animal{
    protected:
            string habitat;
    public:
            Reptile();
            Reptile(string,float,string);
            void showInfo();
};
 
class Snake: public Reptile{
    private:
            bool poisonous;
    public:
            Snake();
            Snake(string,float,string,bool);
            void showInfo();
};
 
//class implementation
//class Animal, display function
void Animal::setAnimal(string name, float weight)
{
    animalName=name;
    weightAnimal=weight;
}
 
void Animal::showInfo(){
    cout<<"Name of the Animal : "<<animalName<<endl;
    cout<<"Weight : "<<weightAnimal<<endl;
}
 
//class implementation
//class Reptile, display function
Reptile::Reptile()
{
    animalName="None";
    weightAnimal=0;
    habitat="None";
}
 
Reptile::Reptile(string name, float weight, string habitat)
{
    setAnimal(name,weight);
    habitat=habitat;
}
 
void Reptile::showInfo()
{
    Animal::showInfo();
    cout<<"Habitat: "<<habitat<<endl;
}
 
//class implementation
//class Snake, display function
Snake::Snake()
{
    animalName="None";
    weightAnimal=0;
    habitat="None";
    poisonous=false;
}
 
Snake::Snake(string name, float weight, string habitat,bool poison):Reptile(name,weight,habitat)
{
    poisonous=poison;
}
 
void Snake::showInfo(){
 
    Reptile::showInfo();
    cout<<"Poisonous: ";
    if (poisonous==1)
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
}
 
//Driver function to test the functionality of the classes
int main(){
 
    Reptile reptile("Lion",123,"Earth");
    Snake snake("Cobra",125,"Water",true);
 
    Animal *animal1=&reptile;
    Animal *animal2=&snake;
 
    animal1->showInfo();
    animal2->showInfo();
 
}
Вопрос заключается в следующем:
1) Я не знаю как создать 4 объекта животных, с последующим заполнением Reptile и Snake.
2) И Второй вопрос у меня параметр habitate не высвечивается, как это исправить?
3) Все ли я правильно делаю?

Добавлено через 43 минуты
Как это выполнить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2017, 16:56
Ответы с готовыми решениями:

Как понять поставленную задачу. Не могу понять этот полиморфизм?
A software academy teaches two types of courses: local courses that are held in some of the academy’s local labs and offsite courses held...

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

Не могу до конца понять условие задачи
Здравствуйте. Задача 9.5 из учебника программированию Б. Страуструпа: Классы Book и Patron у меня уже есть, не пойму следущее:...

5
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.05.2017, 17:10
Лучший ответ Сообщение было отмечено almazuulu как решение

Решение

Цитата Сообщение от almazuulu Посмотреть сообщение
1) Я не знаю как создать 4 объекта животных, с последующим заполнением Reptile и Snake.
Вы не знаете как их сложить в один массив? Сделайте тип массива - указатель (можно smart_pointer) на базовый класс. И записывайте в него адреса объектов производных классов.
Цитата Сообщение от almazuulu Посмотреть сообщение
Второй вопрос у меня параметр habitate не высвечивается, как это исправить?
поменять в конструкторе Reptile строку на
C++
1
this->habitat=habitat;
Иначе у вас локальная переменная перекрывает свойство класса и просто присваивает саму себя. А по хорошему, именовать по разному надо.
Цитата Сообщение от almazuulu Посмотреть сообщение
Все ли я правильно делаю?
Направление движения верное, единственное что я бы у Reptile метод showInfo тоже виртуальный сделал бы. Ну и есть общие замечания по коду - например string передавать по ссылке на константу, использовать список инициализации конструктора, ...
1
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
04.05.2017, 17:43
Лучший ответ Сообщение было отмечено almazuulu как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
Reptile reptile("Лев",123,"Земля");
Snake snake("Кобра",125,"Вода",true);
Reptile r("Свинка",123,"Земля");
Snake s("макака",125,"Земля",true);
 
Animal * tri[4]== {&reptile, &snake, &r, &s};
for(int i=0; i<4; i++)
{
    tri[i]->showInfo();
}
Добавлено через 11 минут
virtual ~Animal() = default; у меня Visual Studia 2012 ошибку на эту строку показывает я заменил на virtual ~Animal()=0;
и работает))
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.05.2017, 17:50
Цитата Сообщение от Antikl Посмотреть сообщение
virtual ~Animal()=0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct A
{
    virtual ~A() = 0;
};
 
struct B : A
{
    ~B(){}
};
 
int main()
{
    A *a = new B;
    delete a;
}
скомпилилось != код без ошибок. Вы бы сначала разобрались для чего это ключевое слово используется.
Аналогичный код выглядел бы так:
C++
1
virtual ~Animal(){}
0
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95
04.05.2017, 17:55  [ТС]
MrGluck, Antikl, Очень благодарен вам за помощь! Спасибо заработало! ))

Добавлено через 1 минуту
MrGluck, ))) хорошо учту.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
04.05.2017, 18:01
Цитата Сообщение от MrGluck Посмотреть сообщение
скомпилилось != код без ошибок. Вы бы сначала разобрались для чего это ключевое слово используется.
Аналогичный код выглядел бы так:
virtual ~Animal(){}
учту
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2017, 18:01
Помогаю со студенческими работами здесь

Хоть убейте, не могу до конца понять if и else
Подскажите пожалуйста ( скрин ниже) Моя цель - указать, что если персонаж мертв, то должна быть надпись &quot;Мертв&quot;.

Не могу понять пример (Апплет)
import java.awt.*; import java.applet.*; /* &lt;applet code=&quot;SimpleBanner&quot; width=300 height=50&gt; &lt;/applet&gt; */ public class...

Простой пример, не могу понять
Тольк-только начал изучать Haskell, как вдруг встретилась такая строка: do grid &lt;- fmap lines getContents Система считывает...

Не могу понять пример из Qtcreator
Дали задание написать калькулятор на кют+ еще дополнить его одной фигней. Начал лазить и искать примеры , пример из кют вообще красивый но...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru