6 / 6 / 0
Регистрация: 04.03.2015
Сообщений: 71
1

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

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

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

Поясняющий код к вопросу:
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. Есть функция в...

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

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

2
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
04.01.2020, 16:48 2
MSha, в данном конкретном случае нужно объявить виртуальную функцию печати в базовом классе и реализовать в классах наследниках. И работать через абстрактный интерфейс, не приводя типы.
1
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
04.01.2020, 17:16 3
Лучший ответ Сообщение было отмечено 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
04.01.2020, 17:16
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2020, 17:16
Помогаю со студенческими работами здесь

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

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

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

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


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

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

Новые блоги и статьи
Какая разница между операторами == и === в сравнениях в JavaScript
bytestream 21.01.2025
В мире веб-разработки JavaScript занимает особое место как динамический язык программирования, предоставляющий разработчикам широкий набор инструментов для создания интерактивных веб-приложений. . . .
Из чего и как собрать свой домашний кинотеатр
bt_guru 21.01.2025
Создание домашнего кинотеатра: от идеи до реализации В современном мире домашний кинотеатр стал неотъемлемой частью комфортного жилого пространства, предоставляя возможность наслаждаться. . .
Ошибки стиральных машин
bt_guru 21.01.2025
Современные стиральные машины представляют собой сложные электронные устройства, оснащенные множеством датчиков и систем контроля. Они способны самостоятельно определять вес загруженного белья,. . .
Копирование (маппинг) объектов в JavaScript
bytestream 21.01.2025
В современной разработке программного обеспечения копирование объектов представляет собой фундаментальную операцию, которая требует особого внимания и понимания. Маппинг объектов в JavaScript – это. . .
Как работать с Apache Kafka в C# .NET
bytestream 21.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки больших объемов информации в реальном времени. Эта система,. . .
Как использовать RabbitMQ в C# .NET
bytestream 21.01.2025
RabbitMQ представляет собой мощный брокер сообщений, который эффективно решает эту задачу, обеспечивая надежную передачу данных между множеством приложений. Этот инструмент реализует протокол AMQP. . .
Как объединить последние коммиты в Git
bytestream 21.01.2025
В мире разработки программного обеспечения система контроля версий Git стала незаменимым инструментом для управления исходным кодом. Одной из наиболее полезных, но порой сложных для освоения функций. . .
Как запушить новую локальную ветку (branch) в удалённый репозиторий Git и отслеживать её
bytestream 21.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемым инструментом для эффективного управления кодом и организации командной работы. Одной из ключевых. . .
Как создать директорию и все родительские директории, указанные в пути, с помощью Python
bytestream 21.01.2025
Python предоставляет мощные инструменты для работы с файловой системой через встроенные модули os и pathlib, которые значительно упрощают процесс манипуляции директориями. Эти модули содержат. . .
Как работать с массивами в JavaScript
bytestream 21.01.2025
Массивы в JavaScript представляют собой один из фундаментальных типов данных, который позволяет хранить упорядоченные коллекции различных элементов в одной переменной. Эта структура данных является. . .
Какая максимальная длина адреса (URL) в различных браузерах и стандартах
bytestream 21.01.2025
В современном мире интернет-технологий URL-адреса (Uniform Resource Locator) играют фундаментальную роль в функционировании веб-пространства. Эти уникальные идентификаторы ресурсов стали неотъемлемой. . .
Как сбросить локальный репозиторий до состояния удалённого репозитория Git
bytestream 21.01.2025
При разработке программного обеспечения с использованием системы контроля версий Git разработчики часто сталкиваются с необходимостью синхронизации локального и удаленного репозиториев. Данная задача. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru