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

Можно ли массив класса родителя заполнить классами наследниками без потери свойств и методов у наследников?

15.08.2020, 18:36. Показов 2384. Ответов 13

Студворк — интернет-сервис помощи студентам
Я создал массив родителя, заполнив его наследниками, но я не могу вызвать соответствующие наследникам методы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2020, 18:36
Ответы с готовыми решениями:

Файл gif сжать без потери свойств
Мне нужно сжать живую картинку.gif для мобильника.Пробовала программой "RIOT", сжалась(от 64 кб до 15 кб), но перестала двигаться. Что я...

Изменение вектора родителя через наследников
В общем, думала, куда написать... Решила все же сюда. В данный момент нужно, чтобы программа расставляла, скажем так, шахматные фигуры на...

Описание всех свойств и методов класса следует вынести в отдельный модель Planet.cpp
source.cpp #include <iostream> #include "Planet.h" int main() { // Создание объекта класса Planet Planets planet; ...

13
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
15.08.2020, 18:45
Вы точно правильно поняли зачем нужно наследие?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
15.08.2020, 19:37
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Можно ли массив класса родителя заполнить классами наследниками без потери свойств и методов у наследников?
Это у вас надо спрашивать, присутствуют ли в родителях все свойства наследников. Если нет, то, разумеется, "лишние" свойства будут потеряны при заполнении.

Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
я не могу вызвать соответствующие наследникам методы.
Потому что в родителях их просто нет.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.08.2020, 19:58
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Можно ли массив класса родителя заполнить классами наследниками без потери свойств и методов у наследников?
MaMkInPoGrOmIsT, базовый класс для доступа к наследникам использовать непосредственно нельзя. Можно использовать лишь ссылки и указатели на базовый класс для этой цели. Но поскольку массивы ссылок создать нельзя то используют указатели. Создайте массив указателей базового класса и установите их на разные объекты наследников. После этого можно использовать методы и свойства наследников. Это в помощь при использовании виртуальных методов.
0
0 / 0 / 0
Регистрация: 27.04.2020
Сообщений: 37
16.08.2020, 10:27  [ТС]
Можете продемонстрировать это?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.08.2020, 10:53
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Можете продемонстрировать это?
ао запросу "массив указателей базового класса C++" первая же ссыль Гугл в наш форум (Слава zss!) :
Массив указателей на базовый класс
мой пример из какого-то старого кода:
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
#include <iostream>
#include <type_traits>
 
#define NDEBUG // assert killer should be before #include <cassert>
 
#include <cassert>
 
using namespace std;
 
struct Base
{
 
    virtual void vf(){cout<<"Base\n";}
    virtual ~Base(){}
};
 
struct Derived :public Base
{
    void vf(){cout<<"Derived\n";}
    int a=123;
    int get_a(){return a;}
    ~Derived(){};
};
 
void foo(Base** arrayPtrBase, size_t n)
{
   cout<<"there\n";
 for(size_t i=0; i<n; ++i)arrayPtrBase[i]->vf();
}
 
void foo(Derived** arrayPtr, size_t n)
{
     cout<<"here\n";
 for(size_t i=0; i<n; ++i)arrayPtr[i]->vf();
}
int count(0);
template <size_t sizeOfArray, class Base_type, class Derived_type>
struct ArrayWrapper
{
        typedef  Derived_type * (&DerrArray_ptrs_type)[sizeOfArray] ;
        typedef  Base_type * (&BaseArray_ptrs_type)[sizeOfArray] ;
 
    ArrayWrapper(DerrArray_ptrs_type derrArray_)
    :derrArray(derrArray_)
    {}
 
    operator  BaseArray_ptrs_type ()
        {
            cout<<"operator  BaseArray_ptrs_type\n";
            if(count++)cin.get();
            return *this ;
        }
 
    Base_type * operator  [] (size_t ind)
    {
        cout<<"operator  []\n";
        return derrArray[ind] ;
    } ;
    enum {Size=sizeOfArray};
    DerrArray_ptrs_type derrArray ;
};
 
int main()
{
 
Base bs1, bs2;
Derived dr1, dr2;
 
Base base_mixed[]={bs1, bs2, dr1, dr2};//как видите компилируется
Derived *pd=static_cast<Derived *>(&base_mixed[0]);
cout<<pd->a<<endl;//boom
cout<<pd->get_a()<<endl;//bada_boom
cout<<"\n_huh__\n";
 
Base base, *pbase=&base;
Derived der1, der2, *pder1=&der1, *pder2=&der2;
Base *ar_bas[]={pbase, pbase,  pbase};
Base *ar_bas_mix[]={pbase, pder1,  pder2};
 
Derived *ar_der[]={pder1,  pder2, pder1,  pder2};
 
ArrayWrapper<sizeof(ar_der)/sizeof(Derived *), Base, Derived>
 arrayWrapper(ar_der);
 
 
cout<<"Somthing will happened\n" ;
 
foo(arrayWrapper, arrayWrapper.Size);
cin.get();
 
foo(ar_bas, sizeof(ar_bas)/sizeof(Base *));
cout<<endl;
foo(ar_bas_mix, sizeof(ar_bas_mix)/sizeof(Base *));
cout<<endl;
foo(ar_der, sizeof(ar_der)/sizeof(Derived *));
return 0;
}
0
0 / 0 / 0
Регистрация: 27.04.2020
Сообщений: 37
16.08.2020, 13:21  [ТС]
В строке 50 ошибка "C2872 count: неоднозначный символ"
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.08.2020, 13:52
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
В строке 50 ошибка "C2872 count: неоднозначный символ"
этот код в куче закоментированных. Может и испорчено что-то не проверял.
MaMkInPoGrOmIsT, посмотрите по ссылке. Вам же понять куда бечь нужно? Или вы хотите готовое задание?
0
0 / 0 / 0
Регистрация: 27.04.2020
Сообщений: 37
16.08.2020, 16:10  [ТС]
Всего лишь надо было прописать static_cast<Наследник>(Элемент Родителя)->МетодНаследника(), или dynamic_cast.
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,815
16.08.2020, 16:28
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Наследник
Знать бы ещё, какого "наследника" пользователь в рантайме выберет, например. Как определяешь тип наследника, к которому нужно привести?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.08.2020, 17:08
Цитата Сообщение от Nishen Посмотреть сообщение
Знать бы ещё, какого "наследника" пользователь в рантайме выберет, например.
Если невиртуальные методы вызываются в цикле, где в основном вызываются виртуальные, это горбыль дизайна, но при помощи преобразования можно нащупать тип наследника (dynamic_cast для полиморфного случая). А статик каст предполагает, что есть id или ещё какая то магия (зависимость) позволяющая юзеру понять что он делает. Иначе - плохо. Хорошо если повиснет, вылетит или диск угробит... Зато будет ясно, что нужно ещё что-то придумать. А если просто не тот одноимённый метод вызовется, то найти что не так будет не просто. А может и не узнает никто.
Перспектива расплывчата.
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Всего лишь надо было
MaMkInPoGrOmIsT, ваш вопрос:
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Я создал массив родителя, заполнив его наследниками, но я не могу вызвать соответствующие наследникам методы.
говорит о том, что он задан человеком не знающем не только об усечении. Тут трудности со смыслом сказанного.
А теперь вы говорите о том, что было нужно. Из вашего вопроса не может следовать того что вы нашли как ответ. Это потому что из вашего вопроса, вообще ни чего не может следовать.
0
0 / 0 / 0
Регистрация: 27.04.2020
Сообщений: 37
16.08.2020, 18:17  [ТС]
Могу даже здесь показать:
C++
1
2
3
4
5
6
7
8
if (dynamic_cast<Первый наследник*>(Элемент Родителя) != NULL)
    {
        /*Выполняем методы первого наследника через static_cast<Первый Наследник*>(Элемент Родителя)->МетодНаследника()*/
    }
    else
    {
        /*Выполняем методы второго наследника через static_cast<Второй Наследник*>(Элемент Родителя)->МетодНаследника()*/
    }
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.08.2020, 19:27
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Могу даже здесь показать:
У вас массив указателей, а спросили вы
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Я создал массив родителя, заполнив его наследниками, но я не могу вызвать соответствующие наследникам методы.
Если вы имели ввиду указатели то стоит имет ввиду ваш русский язык. Я уж не говорю о полиморофном наследовании, которым в вопросе и не пахнет. И учитывая апломб:
Цитата Сообщение от MaMkInPoGrOmIsT Посмотреть сообщение
Всего лишь надо было
До свидания.
0
0 / 0 / 0
Регистрация: 27.04.2020
Сообщений: 37
16.08.2020, 19:55  [ТС]
Всего доброго.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2020, 19:55
Помогаю со студенческими работами здесь

работа с классами - получение наследников
имеем набор скомпилированных Java классов. Эти классы представляют собой иерархию. Все классы находятся в одном java package. Необходимо...

Можно ли из класса родителя просигналить всем потомкам?
Если есть базовый класс &quot;X&quot; и несколько его потомков &quot;A&quot;, &quot;B&quot; и &quot;C&quot;, можно ли как то через объект базового класса сообщить всем созданным...

Можно ли в yii соединить (смержить) scope текущего класса со scope класса родителя?
Добрый день, Например есть: class ActiveRecord extends CActiveRecord { ... return , ];

Можно ли перевести текст без потери форматирования
перевести текст без потери настроек форматирования, это возможно?

Можно ли удешевить сборку без потери качества?
Добрый вечер. Собрал примерный вариант ПК. Получилось примерно 47000 руб. Подскажите, можно ли удешевить сборку без потери качества?...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru