Форум программистов, компьютерный форум CyberForum.ru

Полиморфизм - C++

Восстановить пароль Регистрация
 
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
22.08.2013, 19:57     Полиморфизм #1
Всем доброго времени суток.Сразу к делу. Если описывать с помощью полиморфизма подклассы и потом динамично их создавать ,то можно вызывать замещенные(перегруженные) виртуальные функции описанные в базовом классе. А если мне нужно вызвать функцию которая описана только в подклассе? Если написал бред,- пожалуйста гляньте код. Обратите внимание на 63 строчку. Именно в ней загвоздка
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
#include <iostream>
using namespace std;
 
 
class human
{
      protected:
             int force;
             int age;
      
      public:
//           virtual void work()=0;
             human(){force=100;age=18;}
             human(int f,int a){force=f;age=a;}
             human(int f){force=f;age=18;}
             virtual void eat(){force+=20;cout<<"Я кушаю.\n";}
             virtual void sleep(){force+=10;cout<<"Я сплю.\n";}
};
 
 
class builder:public human
{
             virtual void eat(){force+=20;cout<<"Строитель кушает.\n";}
             virtual void sleep(){force+=10;cout<<"Строитель спит.\n";}
      void work(){force-=20;cout<<"Я строю.\n";}
};
class doctor:public human
{
             virtual void eat(){force+=20;cout<<"Доктор кушает.\n";}
             virtual void sleep(){force+=10;cout<<"Доктор спит.\n";}
          void work(){force-=20;cout<<"Я лечу.\n";}
};      
 
class def:public human
{
             virtual void eat(){force+=20;cout<<"Гибрид кушает.\n";}
             virtual void sleep(){force+=10;cout<<"Гибрид спит.\n";}
          void work(){force-=20;cout<<"Я строю.\n";work1();}
          void work1(){force-=20;cout<<"И к тому же лечу.\n";}
};
 
int main()
{
    int i,k;
    human *array[2];
    for (i=0;i<2;i++)
    {
        cout<<"Пожалуйста,выберите свою профессию(1:строитель,2:доктор) ";
        cin>>k;
        switch(k)
        {
                 case 1:array[i]=new builder;
                                     break;
                 case 2:array[i]=new doctor;
                                     break;
                 default :array[i]=new def;
                 break;
        };
    };
    cout<<"\nПоработаем? \n\n";
    for (i=0;i<2;i++)
    array[i]->eat();
//  array[i]->work();            Ошибка! 
    delete [] array;
    system("pause");
    return 0;
}
P.S. Если сформулировал вопрос не верно ,то будьте добры переформулируйте для меня. В суть полиморфизма вроде въехал ,а вот как грамотно использовать термин - нет)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 19:57     Полиморфизм
Посмотрите здесь:

Полиморфизм C++
Полиморфизм :( C++
C++ полиморфизм
C++ Полиморфизм
Полиморфизм. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
22.08.2013, 20:08     Полиморфизм #2
На сколько мне известно можно явно вызвать функцию из того класса, из которого тебе надо,написав:

C++
1
idiot.doctor::sleep();
но я могу ошибаться.
т.к. не помню точно, давно было.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 20:08     Полиморфизм #3
Добавлен интерфейс с чисто виртуальной функцией work, и множественное наследование
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
#include <iostream>
using namespace std;
 
 
class human
{
      protected:
             int force;
             int age;
      
      public:
//           virtual void work()=0;
             human(){force=100;age=18;}
             human(int f,int a){force=f;age=a;}
             human(int f){force=f;age=18;}
             virtual void eat(){force+=20;cout<<"Я кушаю.\n";}
             virtual void sleep(){force+=10;cout<<"Я сплю.\n";}
};
 
 
struct AdvancedInterface {
   virtual void work() = 0 ;
} ;
 
class builder:public human, public AdvancedInterface
{
             virtual void eat(){force+=20;cout<<"Строитель кушает.\n";}
             virtual void sleep(){force+=10;cout<<"Строитель спит.\n";}
      void work(){force-=20;cout<<"Я строю.\n";}
};
class doctor:public human, public AdvancedInterface
{
             virtual void eat(){force+=20;cout<<"Доктор кушает.\n";}
             virtual void sleep(){force+=10;cout<<"Доктор спит.\n";}
          void work(){force-=20;cout<<"Я лечу.\n";}
};      
 
class def:public human, public AdvancedInterface
{
             virtual void eat(){force+=20;cout<<"Гибрид кушает.\n";}
             virtual void sleep(){force+=10;cout<<"Гибрид спит.\n";}
          void work(){force-=20;cout<<"Я строю.\n";work1();}
          void work1(){force-=20;cout<<"И к тому же лечу.\n";}
};
 
int main()
{
    int i,k;
    human * array[2];
    for (i=0;i<2;i++)
    {
        cout<<"Пожалуйста,выберите свою профессию(1:строитель,2:доктор) ";
        cin>>k;
        switch(k)
        {
                 case 1:array[i]=new builder;
                                     break;
                 case 2:array[i]=new doctor;
                                     break;
                 default :array[i]=new def;
                 break;
        };
    };
    cout<<"\nПоработаем? \n\n";
    for (i=0;i<2;i++){
       array[i]->eat();
       AdvancedInterface *pTemp = dynamic_cast < AdvancedInterface* > ( array [i] ) ;
       if (pTemp){
           pTemp ->work ( ) ;
       }
    }
    for (i=0;i<2;i++){
        delete array[i] ;
    }
    system("pause");
    return 0;
}
В цикле кастуем указатель к AdvancedInterface и если каст удачен, то вызываем функцию work, иначе ничего не делаем
http://ideone.com/75kS4h


И, кстати, delete применяется к памяти, которая выделена с помощью new, а не к массивам "на стеке"
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.08.2013, 20:16     Полиморфизм #4
mrKi, а зачем вы закомментировали 12-ю строку?
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
22.08.2013, 20:21  [ТС]     Полиморфизм #5
Croessmah, раз уж так,то можно просто в базовом прописать
C++
1
    virtual void work()=0;
, не так ли?
и если честно, мне совсем не понятно что вы сделали,Можете описать поподробней ваши действия? да и что значит "кастуем"?

Добавлено через 1 минуту
Jupiter, с ней то оно работает,а если мне нужен будет подкласс без этой функции? так или иначе ее придется перегружать. А хотелось бы сделать отдельные функции для определенных классов.

Добавлено через 1 минуту
VLK, не подходит. в программе создается указатель на массив базового класса. Выбор пользователя мне не известен. Соответственно я не могу написать так как вы предложили
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 20:26     Полиморфизм #6
RTTI
dynamic_cast
Цитата Сообщение от mrKi Посмотреть сообщение
не так ли?
Можно, но вопрос стоял
Цитата Сообщение от mrKi Посмотреть сообщение
А если мне нужно вызвать функцию которая описана только в подклассе?
Тогда Вам нужно определить что это за объект, привести указатель к нужному типу, если это возможно и совершать необходимые операции.
В данном случае, если класс должен содержать work, то наследуем его от AdvancedInterface, если нет - черт с ним.

Добавлено через 3 минуты
Цитата Сообщение от mrKi Посмотреть сообщение
с ней то оно работает,а если мне нужен будет подкласс без этой функции?
Все же люди работают и даже бездельники работают:
Вывод такой:
Бездельник ест.
Я не работаю.
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
22.08.2013, 20:27  [ТС]     Полиморфизм #7
Croessmah, понял. спасибо!) Как раз таки вы дали ответ на мой вопрос.
"Каст" еще не был описан в книге по которой я учу С++,потому такой способ и не пришел мне в голову. За ссылки спасибо ,попробую разобраться
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.08.2013, 20:28     Полиморфизм #8
Цитата Сообщение от mrKi Посмотреть сообщение
а если мне нужен будет подкласс без этой функции?
делаешь её реализацию которая бросает исключение или ничего не делает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2013, 20:31     Полиморфизм
Еще ссылки по теме:

Полиморфизм c++ C++
Полиморфизм C++
C++ Полиморфизм

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

Или воспользуйтесь поиском по форуму:
VLK
22.08.2013, 20:31     Полиморфизм
  #9

Не по теме:

Croessmah, спрашивай по какой книге он учит

Yandex
Объявления
22.08.2013, 20:31     Полиморфизм
Ответ Создать тему
Опции темы

Текущее время: 02:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru