0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95
1

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

04.05.2017, 16:56. Показов 1923. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2017, 16:56
Ответы с готовыми решениями:

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

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

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

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

5
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.05.2017, 17:10 2
Лучший ответ Сообщение было отмечено 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 3
Лучший ответ Сообщение было отмечено 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Эксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.05.2017, 17:50 4
Цитата Сообщение от 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  [ТС] 5
MrGluck, Antikl, Очень благодарен вам за помощь! Спасибо заработало! ))

Добавлено через 1 минуту
MrGluck, ))) хорошо учту.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
04.05.2017, 18:01 6
Цитата Сообщение от MrGluck Посмотреть сообщение
скомпилилось != код без ошибок. Вы бы сначала разобрались для чего это ключевое слово используется.
Аналогичный код выглядел бы так:
virtual ~Animal(){}
учту
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2017, 18:01
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru