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

Передача объектов дочерних классов через массив объектов родительского класса в функцию

04.01.2020, 16:44. Показов 8345. Ответов 2

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в теме теории ООП, так как он кажется мне слишком несерьезным для нее.

Поясняющий код к вопросу:
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
#include <iostream>
 
using namespace std;
 
class GeomObject
{
 
};
 
class Circle: public GeomObject
{
public:
    int radius = 2;
};
 
class Line: public GeomObject
{
public:
    int length = 3;
};
 
void foo(GeomObject *arr, int n)
{
    for (int i = 0; i < n; i++)
    {
//Как правильно реализовать код ниже?
//        if (arr[i] is Circle)
//            print radius 
//        else if (arr[i] is Line)
//            print lenght
    }
}
 
int main()
{
    GeomObject arr[2];
    arr[0] = Circle();
    arr[1] = Line();
 
    foo(arr, 2);
    
    return 0;
}
Вопрос состоит в том, как правильно реализовать такой код. Возможно, я вообще неверно использую наследование и такой код в теории некорректен, тогда, пожалуйста, объясните как можно реализовать данный функционал правильно.

Добавлено через 42 минуты
Пробую через даункастинг (вроде это так называется)

Новый код для Circle, Line, foo и main:
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
class Circle: public GeomObject
{
public:
    int radius = 2;
    void print_circle() {cout << "I am a circle, my radius: "<< radius <<"\n";}
};
 
class Line: public GeomObject
{
public:
    int length = 3;
    void print_line() {cout << "I am a line, my length: " << length << "\n";}
};
 
void foo(GeomObject *arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        GeomObject *arrp = &arr[i];
        Circle *cp = static_cast<Circle *>(arrp);
        if (cp)
            cp->print_circle();
 
        Line *lp = static_cast<Line *>(arrp);
        if (lp)
            lp->print_line();
    }
}
 
int main()
{
    GeomObject arr[2];
    Circle c = Circle();
    Line l = Line();
    c.print_circle();
    l.print_line();
 
    arr[0] = c;
    arr[1] = l;
 
    foo(arr, 2);
 
    return 0;
}
Объекты приводятся к своим исходным типам, но поля теряют свои значения.

Вывод программы:
Кликните здесь для просмотра всего текста
I am a circle, my radius: 2
I am a line, my length: 3
I am a circle, my radius: 0
I am a line, my length: 0
I am a circle, my radius: 0
I am a line, my length: 0
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2020, 16:44
Ответы с готовыми решениями:

Передача объектов пользовательских классов через QVariant
Требуется передать объект пользовательского класса , не наследованного от QObject, через QVariant. Как это можно сделать, не могу...

Создание объектов дочерних классов
Допустим у меня есть класс Parent. И есть дочерние классы ChildA, ChildB, ChildC. Есть функция в которой в зависимости от того какой...

Передача ссылки на объект класса (массив объектов класса)
Доброго времени, уважаемые форумчане. Прошу прощения за столь глупый вопрос, но правда очень долго туплю и не могу понять как это...

2
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
04.01.2020, 16:48
MSha, в данном конкретном случае нужно объявить виртуальную функцию печати в базовом классе и реализовать в классах наследниках. И работать через абстрактный интерфейс, не приводя типы.
1
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
04.01.2020, 17:16
Лучший ответ Сообщение было отмечено MSha как решение

Решение

MSha, это делается примерно так:
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
#include <iostream>
 
using namespace std;
 
class GeomObject
{
public:
    virtual ostream& print(ostream& os) const = 0;
};
 
class Circle : public GeomObject
{
public:
    int radius = 2;
    virtual ostream& print(ostream& os) const override {
        return os << "Circle radius = " << radius << endl;
    }
};
 
class Line : public GeomObject
{
public:
    int length = 3;
    virtual ostream& print(ostream& os) const override {
        return os << "Line length = " << length << endl;
    }
};
 
void foo(GeomObject** arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        arr[i]->print(cout);
    }
}
 
int main()
{
    GeomObject *arr[2];
    arr[0] = new Circle();
    arr[1] = new Line();
    foo(arr, 2);
 
    delete arr[0];
    delete arr[1];
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2020, 17:16
Помогаю со студенческими работами здесь

Передача объектов другого класса в конструктор через params
Здравствуйте. В учебнике есть пример: класс Figure, класс Point. В зависимости от того, сколько &quot;вершин&quot; принимает конструктор...

Сложение объектов базового и наследуемых классов через виртуальную функцию
Нужно определить базовый класс с виртуальной функцией сложения. Кроме того перегрузка этой же виртуальной функции должна складывать...

Массив объектов базового класса, позволяющий работать с набором объектов — чтение, вывод
Расширить программы с классами. Каждый разработанный класс считать базовым; для каждого такого класса описать производный класс - массив...

Занести из файла объекты производных классов в массив объектов базового класса
Здравствуйте. Что в этом коде изменить, чтобы объекты производных классов заносились из файла? using System; namespace...

Масив объектов. Реализовать функцию, которая вернет новый массив объектов с полями id, name и avaragePrice.
Задан маcсив объектов, например: Нужно реализовать функцию, которая вернет новый маcсив, элементы которого должны быть объектами и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru