Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
5 / 5 / 0
Регистрация: 04.03.2015
Сообщений: 71
1

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

04.01.2020, 16:44. Просмотров 2453. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2020, 16:44
Ответы с готовыми решениями:

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

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

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

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

2
582 / 396 / 200
Регистрация: 06.09.2013
Сообщений: 1,146
04.01.2020, 16:48 2
MSha, в данном конкретном случае нужно объявить виртуальную функцию печати в базовом классе и реализовать в классах наследниках. И работать через абстрактный интерфейс, не приводя типы.
1
Мозгоправ
1587 / 926 / 423
Регистрация: 01.10.2018
Сообщений: 1,935
Записей в блоге: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2020, 17:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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