Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка при вызове команды open http://www.cyberforum.ru/cpp-beginners/thread941967.html
Установил на семерку Visual C++ 6.0 Standard Edition. При открытии файлов появляется вот такая вот ошибка. С вылетает. ------------------------------------------------ Имя события...
C++ Спецификаторы %e и %l Доброго времени суток! Столкнулся с кодом, который читает из строки s числа формата x.xxxxe+xx, то есть в качестве примера s=0.23002032e+02. Чтение идет в массив buf. Творю все это с помощью команды... http://www.cyberforum.ru/cpp-beginners/thread941951.html
C++ Заполнение динамического масива
Как заполнить динамический масив определенным числом без использования цыклов, жалательно при определении. Похоже на //int a = {0}; Масив не определенного размера scanf ("%d", &n); int *arry = new...
C++ Палиндромы. Плох ли мой код?
Захотел решить задание, проверить есть ли число палиндромом или нет. Начал как всегда писать код(чисто свой вариант),а уже после этого,я сверялся с другими прогами(таких кодов оказалось полно).И...
C++ Компилятор MinGWStudio 2.05 http://www.cyberforum.ru/cpp-beginners/thread941927.html
Подскажите пожалуйста, есть ли возможность в копиляторе MinGWStudio при использовании отладчика (Debug), попадать в тело функции?? Т.е. #include<iostream> using namespace std; void fn() {...
C++ Подскажите в чем ошибка в моей программе (рекурсия) Программа копирует строку t в конец строки s: вот код: #include<iostream> using namespace std; int i=0; string fn_strcat(string s,string t) { char *p=&t;//создаем указатель "р", изначально на... подробнее

Показать сообщение отдельно
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
22.08.2013, 20:08
Добавлен интерфейс с чисто виртуальной функцией 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, а не к массивам "на стеке"
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru