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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
#1

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

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

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

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

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

Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2011, 19:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ООП + полиморфизм = wtf? (C++):

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

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

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

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

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

Очередное WTF ))) - C++
Вот до чего меня жизнь довела: имеем файл file.txt который содержит просто строку "Hello,World!" (с ковычками). Далее пишем такой код: ...

40
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
27.08.2011, 20:50 #31
Цитата Сообщение от BAIZOR Посмотреть сообщение
А вызов деструктора из детей пойдет?
Я вот только сейчас понял, что эту фразу можно прочитать несколькими способами
Я имел в виду, что при удалении объекта по базовому указателю с помощью delete, будет вызван деструктор наследника, при условии что деструктор виртуальный. Надеюсь в вопросе было это
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:33  [ТС] #32
Цитата Сообщение от 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 #33
Цитата Сообщение от 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
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
27.08.2011, 21:38 #34
Цитата Сообщение от BAIZOR Посмотреть сообщение
UI.push_back( &D3DXButton(...) );
В вектор помещается адрес временного объекта, который тут же уничтожается.

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

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


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

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

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

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

Добавлено через 1 минуту
поидеи вызов UI.clear(); должен вызвать деструкторы всех деток и после почистить их память?
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
27.08.2011, 21:49 #40
Цитата Сообщение от BAIZOR Посмотреть сообщение
поидеи вызов UI.clear(); должен вызвать деструкторы всех деток и после почистить их память?
Нет, он просто удалит указатели, не разрушая сами объекты. Умные указатели при разрушении сами удалят объекты (только std::auto_ptr здесь никак не подойдёт). А с простыми указателями надо в цикле удалять все объекты ручным вызовом delete.
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:52  [ТС] #41
Угу..., ладно, такой вариант у меня тоже был учтен
Спасибо большое!
0
27.08.2011, 21:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 21:52
Привет! Вот еще темы с ответами:

Расширение языка С. WTF? - C++
Hi, All! Решил на выходных заняться учебой, сессия скоро. На эти выходные наметил себе план работ - скачать задания:) Вот сижу читаю...

Спецификация файла. WTF? - C++
Здравствуйте. Что такое спецификация файла (в контексте данной задачи)? В Google ничего понятного не нашел. Заранее спасибо.

map assigment of read only data member или WTF? - C++
задача:из acm.timus.ru 1100. Таблица результатов Ограничение времени: 1.0 секунды Ограничение памяти: 16 МБ Старое программное...

WTF не работает простой код на Visual studio 2008(баг?) - C++
Взял код из википедии. ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru