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

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

27.08.2011, 19:49. Показов 3531. Ответов 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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.08.2011, 19:53
В цикле, вестимо.
0
 Аватар для ЛеЖиК)
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
27.08.2011, 19:54
C++
1
2
for(int i=0;i<100;i++)
     Mass[i].f();
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 19:57
Только выглядеть это должно бы
C++
1
Mass[i]->f();
а функция f() должна быть виртуальной.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:04  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Только выглядеть это должно бы
C++
1
Mass[i]->f();
а функция f() должна быть виртуальной.

D3D_UI == клас А
D3DXButton == класс Б
setStatus == F()

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class D3D_UI
{
public:
      ....
      virtual void setStatus(LPVOID Object,int newstatus);
};
 
class D3DXButton : public D3D_UI
{
public:
  ...........
    void setStatus(LPVOID Object,int newstatus)
    {
           ....
        }
};
Error 75 error LNK2001: unresolved external symbol "public: virtual void __thiscall D3D_UI::setStatus(void *,int)" (?setStatus@D3D_UI@@UAEXPAXH@Z) C:\Users\BAIZOR\Desktop\Robotino V3 Directx 9 - копия\Robotino V2 Directx 9\Robotino V2 Directx 9.obj Robotino V2 Directx 9

Добавлено через 1 минуту
А если юзать в вызове ->


Error 23 error C2819: type 'D3D_UI' does not have an overloaded member 'operator ->' c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\Direct_All.h 710 1 Robotino V2 Directx 9
0
Заблокирован
27.08.2011, 20:07
ну он вам пишет, что объект пытается использовать функцию, у которой отсутствует тело.

C++
1
2
3
4
void setStatus(LPVOID Object,int newstatus)
{
....
}
Надо ж ещё указывать имя класса, к которому эта функция относится
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:09
Цитата Сообщение от BAIZOR Посмотреть сообщение
Error 75 error LNK2001: unresolved external symbol "public: virtual void __thiscall D3D_UI::setStatus(void *,int)" (?setStatus@D3D_UI@@UAEXPAXH@Z) C:\Users\BAIZOR\Desktop\Robotino V3 Directx 9 - копия\Robotino V2 Directx 9\Robotino V2 Directx 9.obj Robotino V2 Directx 9
Ну так определение setStatus() для класса D3D_UI есть?
Или, если класс D3D_UI абстрактный, то функцию надо объявить в этом классе как "чистую виртуальную"
C++
1
virtual void setStatus(LPVOID Object,int newstatus) = 0;
Цитата Сообщение от BAIZOR Посмотреть сообщение
А если юзать в вызове ->
А как Вы создаёте массив "детей" без указателей?

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Надо ж ещё указывать имя класса, к которому эта функция относится
Да у него эта функция для "дитя". Внутри определения класса.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.08.2011, 20:09
Цитата Сообщение от BAIZOR Посмотреть сообщение
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)
Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.
в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).
Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
Ну, во-первых не массив, а вектор, во-вторых не типа А, а типа А*,
ну и, в третьих, нужно воспользоваться алгоритмом for_each.
0
Заблокирован
27.08.2011, 20:10
/зы

Как вариант, можно вместо виртуальной функции заюзать паттерн "стратегия".
То бишь, использовать функторы, либо указатели на функцию, либо стратегии при помощи шаблонов.
0
Заблокирован
27.08.2011, 20:10
Цитата Сообщение от BAIZOR Посмотреть сообщение
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)

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

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

Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
Массив типа A не может в себе хранить объекты B и C. Это может делать только массив указателей на класс A.
0
27.08.2011, 20:12

Не по теме:

Отец, сестра... Как вы у них пол различаете? :D

0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:12  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
ну он вам пишет, что объект пытается использовать функцию, у которой отсутствует тело.

C++
1
2
3
4
void setStatus(LPVOID Object,int newstatus)
{
....
}
Надо ж ещё указывать имя класса, к которому эта функция относится

но мне нужен вызов функции из детей а не отца...
0
27.08.2011, 20:13

Не по теме:

grizlik78, нуу, у Б есть такая дырочка, а у Ц есть такой хвостик... :D:D

1
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:14  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
А как Вы создаёте массив "детей" без указателей?
UI == Mass

C++
1
2
D3DXButton Connect(...);
UI.push_back(Connect);
Добавлено через 40 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
Отец, сестра... Как вы у них пол различаете?
годы практики xDD))
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:15
Цитата Сообщение от BAIZOR Посмотреть сообщение
но мне нужен вызов функции из детей а не отца...
Так вызываете-то Вы их пока именно от отца. А даже если сделать правильно, то либо придётся для отца её определить, пусть и с пустым телом, либо сделать родительский класс абстрактным.
0
Заблокирован
27.08.2011, 20:15
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да у него эта функция для "дитя". Внутри определения класса.
Аааа... точна-точна. Действительно!

В общем, если кратко: класс А должен содержать интерфейс управления всем семейством полиморфных классов.

А класс Б, как потомок класса А - лишь конкретные реализации виртуальных методов класса А.
И тогда все будит нормально.
0
Заблокирован
27.08.2011, 20:16
Цитата Сообщение от BAIZOR Посмотреть сообщение
А если юзать в вызове ->


Error 23 error C2819: type 'D3D_UI' does not have an overloaded member 'operator ->' c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\Direct_All.h 710 1 Robotino V2 Directx 9
Это сообщение ясно, почему берется. Вы пытаетесь к объекту класса применить оператор ->, а в вашем классе этот оператор не определен. То есть у вас изначально неправильная конструкция. Наверное, когда вы формировали свой массив типа A, вы присваивали его элементам объекты класса B и C. Но в этом случае происходила "срезка", то есть в элементы вашего массива заносились лишь базовый класс ваших производных классов B и C.

Может быть вам следуеть базовый класс A объявить как абстрактный, и тогда бы вы такой ошибки неправильной конструкции массива не допустили бы, так как на этапе компиляции компилятор выловил бы такую ошибку, как объявление массива типа A и присваивание его элементам производных классов B и C.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.08.2011, 20:18
Цитата Сообщение от BAIZOR Посмотреть сообщение
UI == Mass

C++
1
2
D3DXButton Connect(...);
UI.push_back(Connect);
Да, да. Пока именно "срезка" и получается.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:20  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это сообщение ясно, почему берется. Вы пытаетесь к объекту класса применить оператор ->, а в вашем классе этот оператор не определен. То есть у вас изначально неправильная конструкция. Наверное, когда вы формировали свой массив типа A, вы присваивали его элементам объекты класса B и C. Но в этом случае происходила "срезка", то есть в элементы вашего массива заносились лишь базовый класс ваших производных классов B и C.
Спасибо, мне предложили этот вариант, и я просто продемонтрировал что он не рабочий.




Я уже понял все, только одного не знаю - как сделать класс Абстрактным, я давненько это делал... в нем не может быть не абстрактных функций и еще что-то ?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.08.2011, 20:20
BAIZOR, в нём должна быть хотя бы одна чисто виртуальная функция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2011, 20:20
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru