Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68

ООП + полиморфизм = wtf?

27.08.2011, 19:49. Показов 4049. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)

Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.

в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).

Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2011, 19:49
Ответы с готовыми решениями:

ООП. Полиморфизм
Мальчики, учусь на МехМате. Для сдачи зачёта по ООП необходимо написать последнюю программу: Задание: полиморфизм Указание: во всех...

ООП Полиморфизм Наследование
У меня есть базовый класс и 2 производных от него класса... Как сделать, чтобы в программе я мог сделать такое обьявление: Force fc;...

Полиморфизм инкапсуляция и наследование(ООП)
Не как не могу понять зачем нужен Полиморфизм и инкапсуляция и их определение может вы подскажите, наследования я знаю

40
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:22  [ТС]
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
abstract class D3D_UI
{
      virtual void setStatus(LPVOID Object,int newstatus) = 0;
};


this declaration has no storage class or type specifier c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\direct3d_ui.h 1 1 Robotino V2 Directx 9



позабыл я как это делаеться?
0
Заблокирован
27.08.2011, 20:25
Цитата Сообщение от BAIZOR Посмотреть сообщение
Спасибо, мне предложили этот вариант, и я просто продемонтрировал что он не рабочий.

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

Вы можете в своем базовом классе функцию setStatus объявить следующим образом

C++
1
virtual void setStatus(LPVOID Object,int newstatus) = 0;
Это между прочим не мешает вам опеределить в базовом классе тело самой функции, если есть такая необходимость, то есть если в производных классах в этой функции используется вызов setStatus из их кода.

Добавлено через 1 минуту
Цитата Сообщение от BAIZOR Посмотреть сообщение
C++
1
2
3
4
abstract class D3D_UI
{
      virtual void setStatus(LPVOID Object,int newstatus) = 0;
};


this declaration has no storage class or type specifier c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\direct3d_ui.h 1 1 Robotino V2 Directx 9



позабыл я как это делаеться?
Больше ничего добавлять не надо. Достаточно одну функцию объявить чисто виртуальной. Проще всего это сделать для деструктора класса.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:26  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это между прочим не мешает вам опеределить в базовом классе тело самой функции, если есть такая необходимость, то есть если в производных классах в этой функции используется вызов setStatus из их кода.
хм... мудро, учту

Добавлено через 42 секунды
Цитата Сообщение от Сыроежка Посмотреть сообщение
Больше ничего добавлять не надо. Достаточно одну функцию объявить чисто виртуальной. Проще всего это сделать для деструктора класса.
да, но ошибка, вон, я дописал под кодом
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:26
Цитата Сообщение от BAIZOR Посмотреть сообщение
позабыл я как это делаеться?
Слово abstract зачем?
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:29  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
this declaration has no storage class or type specifier

=(....

Добавлено через 52 секунды
Цитата Сообщение от grizlik78 Посмотреть сообщение
Слово abstract зачем?
убрал - 'D3D_UI' : cannot instantiate abstract class

Добавлено через 37 секунд
опять же, вопрос, разве ничего больше не надо для абстрактного класса?

Добавлено через 29 секунд
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class D3D_UI
{
protected:
    UINT                        status;
    LPDIRECT3DTEXTURE9          sleep,activ,down;
    LPDIRECT3DVERTEXBUFFER9     g_pVB;
    bool                        enable;
    time_t                      timer;
    bool                        (*function)(Robotino3D*);
 
public:
    D3DRectangle                Rectangle;
    bool                        Down;
 
    D3D_UI(){status=0;}
    D3D_UI(LPDIRECT3DDEVICE9 &pd3dDevice,
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        UpdateObject(pd3dDevice, sleep_, activ_, down_, x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    static void TransformCoords(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                D3DCamera &Camera, 
                                D3DXMATRIX &Transform, 
                                D3DXVECTOR3 &pos, 
                                D3DXVECTOR3 &dir, 
                                int x, 
                                int y)
    {
        float                       px,
                                    py;
 
        D3DVIEWPORT9                ViewPort;
        D3DXMATRIX                  MatrixProjection;
 
        pd3dDevice->GetViewport     (&ViewPort);
        pd3dDevice->GetTransform    (D3DTS_PROJECTION, &MatrixProjection);
 
        px      =   ((( 2.0f*(float)x) / (float)ViewPort.Width)  - 1.0f) / MatrixProjection._11;
        py      =   (((-2.0f*(float)y) / (float)ViewPort.Height) + 1.0f) / MatrixProjection._22;
 
        pos.x   =   Camera.CamPos.x; 
        pos.y   =   Camera.CamPos.y; 
        pos.z   =   Camera.CamPos.z;
  
        dir.x   =   px; 
        dir.y   =   py; 
        dir.z   =   1.0;
 
        D3DXVec3TransformCoord( 
          &pos, 
          &pos, 
          &Transform 
        ); 
  
        D3DXVec3TransformNormal( 
          &dir, 
          &dir, 
          &Transform 
        );
    }
    virtual void setStatus(LPVOID Object,int newstatus) = 0;
 
    bool Select(D3DXVECTOR3 &pos, D3DXVECTOR3 &dir)
    {
        float               Distance    =   2000.0f;
 
        CUSTOMVERTEX        *buffer     =   Rectangle.init();
 
        bool                Result_1    =   false,
                            Result_2    =   false;
 
        Result_1    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[0].x, buffer[0].y, buffer[0].z), 
                                                &D3DXVECTOR3(buffer[1].x, buffer[1].y, buffer[1].z),
                                                &D3DXVECTOR3(buffer[2].x, buffer[2].y, buffer[2].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        Result_2    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[3].x, buffer[3].y, buffer[3].z), 
                                                &D3DXVECTOR3(buffer[4].x, buffer[4].y, buffer[4].z),
                                                &D3DXVECTOR3(buffer[5].x, buffer[5].y, buffer[5].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        return Result_1 || Result_2;
    }
    void SetTimer(UINT t_size)
    {
        timer   =   clock() + t_size;
    }
    void UpdateObject(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        Down        = false;
        status      = 0;
        g_pVB       =   NULL;
        sleep       =   NULL;
        activ       =   NULL;
        down        =   NULL;
        D3DXCreateTextureFromFile(pd3dDevice,sleep_, &sleep);
        D3DXCreateTextureFromFile(pd3dDevice,activ_, &activ);
        D3DXCreateTextureFromFile(pd3dDevice,down_ , &down);
        Rectangle   = *new D3DRectangle(x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    LPDIRECT3DTEXTURE9 getTexture()
    {
        if(status == 0) return sleep;
        if(status == 1) return activ;
        if(status == 2) return down;
    }
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
        pd3dDevice->SetFVF              ( D3DFVF_CUSTOMVERTEX );
        pd3dDevice->SetStreamSource     ( 0, g_pVB, 0, sizeof(CUSTOMVERTEX));
 
        if(FAILED(pd3dDevice->SetTexture    (0, getTexture())))             return false;
        if(FAILED(pd3dDevice->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 2)))    return false;
 
        return true;
    }
};
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:31
Цитата Сообщение от BAIZOR Посмотреть сообщение
убрал - 'D3D_UI' : cannot instantiate abstract class
Ну да. Потому что нельзя создать вектор с элементами этого типа. Можно и нужно создать вектор указателей на этот класс. Правда удалять элементы тогда вручную придётся.

Добавлено через 2 минуты
Кстати, возможно этот класс и не должен быть абстрактным. Это было просто предположение. Но потомков в один массив собрать можно только с помощью указателей.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:33  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Потому что нельзя создать вектор с элементами этого типа.
Вот оно! Спасибо =)

Цитата Сообщение от grizlik78 Посмотреть сообщение
Правда удалять элементы тогда вручную придётся
А вызов деструктора из детей пойдет?
0
Заблокирован
27.08.2011, 20:33
Цитата Сообщение от BAIZOR Посмотреть сообщение
=(....

Добавлено через 52 секунды


убрал - 'D3D_UI' : cannot instantiate abstract class

Добавлено через 37 секунд
опять же, вопрос, разве ничего больше не надо для абстрактного класса?

Добавлено через 29 секунд
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class D3D_UI
{
protected:
    UINT                        status;
    LPDIRECT3DTEXTURE9          sleep,activ,down;
    LPDIRECT3DVERTEXBUFFER9     g_pVB;
    bool                        enable;
    time_t                      timer;
    bool                        (*function)(Robotino3D*);
 
public:
    D3DRectangle                Rectangle;
    bool                        Down;
 
    D3D_UI(){status=0;}
    D3D_UI(LPDIRECT3DDEVICE9 &pd3dDevice,
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        UpdateObject(pd3dDevice, sleep_, activ_, down_, x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    static void TransformCoords(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                D3DCamera &Camera, 
                                D3DXMATRIX &Transform, 
                                D3DXVECTOR3 &pos, 
                                D3DXVECTOR3 &dir, 
                                int x, 
                                int y)
    {
        float                       px,
                                    py;
 
        D3DVIEWPORT9                ViewPort;
        D3DXMATRIX                  MatrixProjection;
 
        pd3dDevice->GetViewport     (&ViewPort);
        pd3dDevice->GetTransform    (D3DTS_PROJECTION, &MatrixProjection);
 
        px      =   ((( 2.0f*(float)x) / (float)ViewPort.Width)  - 1.0f) / MatrixProjection._11;
        py      =   (((-2.0f*(float)y) / (float)ViewPort.Height) + 1.0f) / MatrixProjection._22;
 
        pos.x   =   Camera.CamPos.x; 
        pos.y   =   Camera.CamPos.y; 
        pos.z   =   Camera.CamPos.z;
  
        dir.x   =   px; 
        dir.y   =   py; 
        dir.z   =   1.0;
 
        D3DXVec3TransformCoord( 
          &pos, 
          &pos, 
          &Transform 
        ); 
  
        D3DXVec3TransformNormal( 
          &dir, 
          &dir, 
          &Transform 
        );
    }
    virtual void setStatus(LPVOID Object,int newstatus) = 0;
 
    bool Select(D3DXVECTOR3 &pos, D3DXVECTOR3 &dir)
    {
        float               Distance    =   2000.0f;
 
        CUSTOMVERTEX        *buffer     =   Rectangle.init();
 
        bool                Result_1    =   false,
                            Result_2    =   false;
 
        Result_1    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[0].x, buffer[0].y, buffer[0].z), 
                                                &D3DXVECTOR3(buffer[1].x, buffer[1].y, buffer[1].z),
                                                &D3DXVECTOR3(buffer[2].x, buffer[2].y, buffer[2].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        Result_2    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[3].x, buffer[3].y, buffer[3].z), 
                                                &D3DXVECTOR3(buffer[4].x, buffer[4].y, buffer[4].z),
                                                &D3DXVECTOR3(buffer[5].x, buffer[5].y, buffer[5].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        return Result_1 || Result_2;
    }
    void SetTimer(UINT t_size)
    {
        timer   =   clock() + t_size;
    }
    void UpdateObject(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        Down        = false;
        status      = 0;
        g_pVB       =   NULL;
        sleep       =   NULL;
        activ       =   NULL;
        down        =   NULL;
        D3DXCreateTextureFromFile(pd3dDevice,sleep_, &sleep);
        D3DXCreateTextureFromFile(pd3dDevice,activ_, &activ);
        D3DXCreateTextureFromFile(pd3dDevice,down_ , &down);
        Rectangle   = *new D3DRectangle(x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    LPDIRECT3DTEXTURE9 getTexture()
    {
        if(status == 0) return sleep;
        if(status == 1) return activ;
        if(status == 2) return down;
    }
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
        pd3dDevice->SetFVF              ( D3DFVF_CUSTOMVERTEX );
        pd3dDevice->SetStreamSource     ( 0, g_pVB, 0, sizeof(CUSTOMVERTEX));
 
        if(FAILED(pd3dDevice->SetTexture    (0, getTexture())))             return false;
        if(FAILED(pd3dDevice->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 2)))    return false;
 
        return true;
    }
};
Это означает, что где-то в коде main вы пытаетесь создать объект базового класса. Можно использовать лишь указатель на базовый класс или ссылку.
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:36
Цитата Сообщение от BAIZOR Посмотреть сообщение
А вызов деструктора из детей пойдет?
Пойдёт из детей, только деструктор должен быть объявлен в базовом классе как виртуальный. Для полиморфных классов это обязательно, кстати.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:47  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Пойдёт из детей, только деструктор должен быть объявлен в базовом классе как виртуальный. Для полиморфных классов это обязательно, кстати.
Окей, спасибо большое!)
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:50
Цитата Сообщение от BAIZOR Посмотреть сообщение
А вызов деструктора из детей пойдет?
Я вот только сейчас понял, что эту фразу можно прочитать несколькими способами
Я имел в виду, что при удалении объекта по базовому указателю с помощью delete, будет вызван деструктор наследника, при условии что деструктор виртуальный. Надеюсь в вопросе было это
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:33  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я имел в виду, что при удалении объекта по базовому указателю с помощью delete, будет вызван деструктор наследника, при условии что деструктор виртуальный. Надеюсь в вопросе было это
да да) я просто стараюсь говорить проще, а то достало когда люди меня не понимают

Добавлено через 19 минут
Господа... а у меня программа падает на вызове такоей же функции, только она с названием Render();

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main()
{
        vector<D3D_UI*>             UI;
        UI.push_back( &D3DXButton(...) );
        UI[0]->Render(); [COLOR="Red"]//вылетело - зависло[/COLOR]
}
 
class D3D_UI
{
public:
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice) = 0;
};
 
class D3DXButton : public D3D_UI
{
public:
    bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
              ....
        }
};
0
Заблокирован
27.08.2011, 21:35
Цитата Сообщение от BAIZOR Посмотреть сообщение
да да) я просто стараюсь говорить проще, а то достало когда люди меня не понимают

Добавлено через 19 минут
Господа... а у меня программа падает на вызове такоей же функции, только она с названием Render();

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main()
{
        vector<D3D_UI*>             UI;
        UI.push_back( &D3DXButton(...) );
        UI[0]->Render(); [COLOR="Red"]//вылетело - зависло[/COLOR]
}
 
class D3D_UI
{
public:
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice) = 0;
};
 
class D3DXButton : public D3D_UI
{
public:
    bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
              ....
        }
};
В режиме отладки пройдитесь по предложениям вашей функции и посмотрите, где она виснет!
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 21:38
Цитата Сообщение от BAIZOR Посмотреть сообщение
UI.push_back( &D3DXButton(...) );
В вектор помещается адрес временного объекта, который тут же уничтожается.

Добавлено через 1 минуту
Правда сомнения у меня, что такое может компилироваться

Добавлено через 1 минуту
Но, к сожалению, компилируется.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:42  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
В режиме отладки пройдитесь по предложениям вашей функции и посмотрите, где она виснет!
"Виснет" именно на вызове, не в ней, а на вызове.


Цитата Сообщение от grizlik78 Посмотреть сообщение
В вектор помещается адрес временного объекта, который тут же уничтожается.
я так и думал... но как же это обойти?

может как то так

C++
1
UI.push_back( &*&D3DXButton(...) );
если только скомпилируеться.. =)
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 21:43
new/delete
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:44  [ТС]
Цитата Сообщение от BAIZOR Посмотреть сообщение
Код C++
1
UI.push_back( &*&D3DXButton(...) );
если только скомпилируеться.. =)
скомпилировалось.. но эффект тот же

Добавлено через 20 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
new/delete
сейчас попробую...
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 21:45
Избавиться от необходимости delete можно с помощью "умных" указателей. А вот от new избавиться не удастся. Не переменные же отдельные создавать
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:46  [ТС]
C++
1
UI.push_back( new D3DXButton (...) );
Ура!) Выручили внатуре!! =)

Добавлено через 1 минуту
поидеи вызов UI.clear(); должен вызвать деструкторы всех деток и после почистить их память?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 21:49
Цитата Сообщение от BAIZOR Посмотреть сообщение
поидеи вызов UI.clear(); должен вызвать деструкторы всех деток и после почистить их память?
Нет, он просто удалит указатели, не разрушая сами объекты. Умные указатели при разрушении сами удалят объекты (только std::auto_ptr здесь никак не подойдёт). А с простыми указателями надо в цикле удалять все объекты ручным вызовом delete.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2011, 21:49

Подкиньте практику по ООП + полиморфизм + шаблоны пожалуйста.
Здравствуйте форумчане. Хотел бы попросить подбросить практику по таким темам: ООП - полифорфизм + Тэмплэты. Ну и если можно, что нибудь...

ООП в С++ (наследование, инкапсуляция, полиморфизм, перегрузка операторов): что читать?
Нужно освежить, подзабылось. Были у меня институцкие методички доцента Шеховцова. Хороша вещь, но потерялись. Нужны либо набор...

загадочный полиморфизм в ООП
Всем привет! у меня вот спросили недавно, что я могу назвать полиморфизмом. дали пример (см. ниже) и попросили показать проявление...

Принципы ООП (наследование, инкапсуляция и полиморфизм)
1. Принципы ООП (наследование, инкапсуляция и полиморфизм).

WTF 2
Что это шестиногое? - Доктор, посмотрите, что это у меня? - ААА!! ЧТО ЭТО У ВАС?! ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru