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

Иерархия классов

11.06.2020, 10:35. Показов 1005. Ответов 17

Студворк — интернет-сервис помощи студентам
Разработать класс А. Класс А должен обладать двумя полями, где одно поле вещественного типа, а второе поле пара целых чисел. Реализовать чисто абстрактный метод возвращающий пару чисел. Создать класс Б наследующий класс А. Класс Б должен реализовывать метод возвращающий пару чисел. В основной функции создать указатель на класс А и записать в него адрес экземпляра класса Б созданного в динамической памяти. Вызвать через указатель метод класса.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2020, 10:35
Ответы с готовыми решениями:

Иерархия классов
Ребят может кто скинуть иерархию всех классов Делфи? Может в виде таблицы есть у кого или в виде иерархического дерева?. Слышал что...

Иерархия стандартных классов .Net
Где можно посмотреть иерархию стандартных классов .Net?

Иерархия классов
Добрый вечер. Такое задание. Реализовать иерархию понятий "Студент" , "Группа" , "Факультет" . Группу представить...

17
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,687
11.06.2020, 13:34
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A
{
public:
    virtual Pair getPair(void) = 0;
protected:
    double field1;
    struct Pair { int one, two } pair;
};
 
class B : public A
{
public:
    virtual Pair getPair(void) override { return pair; }
};
 
int main()
{
    A *obj = new B;
    obj->getPair();
    return 0;
}
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
11.06.2020, 14:56
а как здесь ещё по-правильному расставить и использовать конструктор и деструктор... (чтобы не через динамическую память создавать экземпляры?)
... сначала вроде создаётся родитель, потом наследник, а в деструкторе удаляются наоборот... как добавить в код и будут ли они virtual?
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.06.2020, 06:49
Цитата Сообщение от Annemesski Посмотреть сообщение
class A
честно говоря, что-то такой код не отрабатывает...
отрабатывает такой - для примера по наследованию
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
class B {
   public:
      virtual void s() {
         cout<<" In Base \n";
      }
};
class D: public B {
   public:
      void s() {
         cout<<"In Derived \n";
      }
};
int main(void) {
   D d; // An object of class D
   B *b= &d; // A pointer of type B* pointing to d
   b->s(); // prints"D::s() called"
   return 0;
}

Цитата Сообщение от JolyRed Посмотреть сообщение
Разработать класс А. Класс А должен обладать двумя полями, где одно поле вещественного типа, а второе поле пара целых чисел...
... подумаю, на досуге...
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.06.2020, 07:26
Цитата Сообщение от JeyCi Посмотреть сообщение
отрабатывает такой - для примера по наследованию
что бы с локальными объектами без указателей:
C++
1
2
3
4
5
6
7
8
9
int main()
{
   D d;
 
   B & b = d;
   b.s();
 
   return 0;
}
Добавлено через 8 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
а как здесь ещё по-правильному расставить и использовать конструктор и деструктор...
конструктор и деструктор в данном коде объявлять избыточно. но по правильному в полиморфных классах нужно объявить виртуальный деструктор, достаточно объявить его в базовом классе и все наследники унаследуют его виртуальность.

Добавлено через 54 секунды
Цитата Сообщение от JeyCi Посмотреть сообщение
(чтобы не через динамическую память создавать экземпляры?)
это здесь на при чем.
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.06.2020, 13:50
Цитата Сообщение от JeyCi Посмотреть сообщение
честно говоря, что-то такой код не отрабатывает...
а вобщем-то отработал такой
Кликните здесь для просмотра всего текста
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
class A
{
public:
    struct Pair { int one, two; } pair;
    virtual Pair getPair(void) = 0;
protected:
    int field1;
    int field2;
};
 
class B : public A
{
public:
    virtual Pair getPair(void) override { return pair; }
};
 
int main()
{
    A *obj = new B;
    obj->getPair();
    obj->pair={2,3};
    std::cout << obj->pair.one << "; " << obj->pair.two << std::endl;
    return 0;
}
только не поняла смысл (и главное, способ) использования protected здесь??... но на public'ах вроде override сделался, как надо?.. хотя задача, наверно, всё-таки protected подрядить?..


Добавлено через 4 часа 24 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
смысл (и главное, способ) использования protected здесь??...
с void справилась:
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
class A
{
public:         // выходит в main   
    virtual void  getPair() = 0;
    void showComplexNum()
    {
        std::cout << "First_Num: " << pair.one << std::endl;
        std::cout << "Second_Num: " << pair.two << std::endl;
    }
 
protected:  //выходит в class B
    // одно поле вещественного типа, а второе поле пара целых чисел
    double field1;      
    struct Pair { int one, two; } pair={2, 3};  // можно задать здесь !?     
};
 
class B : public A
{
    public:
        virtual void  getPair() override { std::cout << pair.one << "." << pair.two << std::endl; }
};
 
int main()
{   
    A  *obj = new B;
    
    //obj->pair={4,5};  //<<<<<<<<<<<<<< error: 'A::Pair A::pair' is protected within this context
    obj->getPair();     
    obj->showComplexNum();
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.06.2020, 17:29
Цитата Сообщение от JeyCi Посмотреть сообщение
//obj->pair={4,5};  //<<<<<<<<<<<<<< error: 'A::Pair A:air' is protected within this context
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
public:
    A(double x, const Pair &y)
    : field1(x)
    , pair(y)
    {
    }
..................
};
 
 
class B: public A
{
public:
    using A::A;
    virtual void  getPair() override { std::cout << pair.one << "." << pair.two << std::endl; }
};
 
int main()
{   
    A  *obj = new B(1, {2, 3});
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.06.2020, 17:47
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
using A::A;
очень интересная семантика - спасибо! не думала о таком ещё... хотя логично...
==
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
public:
A(double x, const Pair &y) : field1(x) , pair(y) { }
error: 'Pair' does not name a type
-- уже такую ошибку встречала, пока экспериментировала... не могу понять её и как обойти её... Конструктор в public'e, конечно, не помешает!.. а то даже setter'a нет...
но у меня при размещении в public Pair.. что-то всегда так ругается?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.06.2020, 17:52
Цитата Сообщение от JeyCi Посмотреть сообщение
error: 'Pair' does not name a type
-- уже такую ошибку встречала, пока экспериментировала... не могу понять её и как обойти её... Конструктор в public'e, конечно, не помешает!.. а то даже setter'a нет...
но у меня при размещении в public Pair.. что-то всегда так ругается?
Объяви его снаружи класса A
C++
1
2
3
4
5
6
 struct Pair { int one, two; };
class A
{
....................
Pair pair;
};
Добавлено через 25 секунд
А ещё лучше, используй вместо него
C++
1
 std::pair<int, int>
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.06.2020, 18:00
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Объяви его снаружи класса A
вот это уже лучше
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
#include <iostream>
 
struct Pair { int one, two; };
 
class A
{   
public:     
    
    // конструктор
    A(double x, const Pair &y) : field1(x) , pair(y) { };
    virtual void  getPair() = 0;
    void showComplexNum()
    {
        std::cout << "First_Num: " << pair.one << std::endl;
        std::cout << "Second_Num: " << pair.two << std::endl;
    }
 
protected:  
    double field1;    // одно поле вещественного типа, 
    Pair pair;      // а второе поле пара целых чисел     
};
 
class B: public A
{
public:
    using A::A;
    virtual void  getPair() override { std::cout << pair.one << "." << pair.two << std::endl; }
};
 
int main()
{   
    A  *obj = new B(1, {2, 3});
    obj->getPair();     
    obj->showComplexNum();
    return 0;
}
если я здесь правильно раскидала по зонам видимости?
0
14.06.2020, 18:03

Не по теме:

Еще не известно что хуже, задания, вроде этого, в которых предлагают связывать наследованием то, что связываться так не должно, или вот такое, как здесь, когда людей учат на абстрактных A и B, которые ничего не выражают.
Преподавательская импотенция какая-то.

0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.06.2020, 18:51
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
1
std::pair<int, int>
тоже компилируется ок
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class A
{   
public:     
    // конструктор
    A(double x, const std::pair<int, int> &y) : field1(x) , pair(y) { };
       // методы
    virtual void  getPair() = 0;
    void showComplexNum()
    {
        std::cout << "First_Num: " << pair.first << std::endl;
        std::cout << "Second_Num: " << pair.second << std::endl;
    }
 
protected: 
    double field1;      // одно поле вещественного типа,
     std::pair<int, int> pair;         // а второе поле пара целых чисел      
};
 
class B: public A
{
public:
    using A::A;
    virtual void  getPair() override { std::cout << pair.first << "." << pair.second << std::endl; }
};
 
int main()
{   
    A  *obj = new B(1, {2, 3});      //конструктор от родителя (от A) унаследован
    obj->getPair();     // свой (от B) переопределён
    obj->showComplexNum();    // от родителя (от A) унаследован
    return 0;
}


Добавлено через 12 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
или вот такое, как здесь, когда людей учат на абстрактных A и B
конструктор родительский, а геттер у потомка свой от того, что сконструировал родитель... даже не знаю, где от такого пользу можно получить... так размазать на 2 класса создание объекта и его использование?

Добавлено через 4 минуты
хотя, наверно, геттеров несколько можно сделать - каждый в свой класс... и там с объектом делать что угодно, в зависимости от класса-потомка... имхо
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.06.2020, 19:01
Цитата Сообщение от JeyCi Посмотреть сообщение
хотя, наверно, геттеров несколько можно сделать - каждый в свой класс... и там с объектом делать что угодно, в зависимости от класса-потомка... имхо
Такое ощущение, что в задании перепутаны классы A и B. Ты уверена, что оно правильное?
Должно быть как-то вот так
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
class A
{   
public:     
    virtual const std::pair<int, int> &getPair() = 0;
    void showComplexNum()
    {
        auto &pair = getPair();
        std::cout << "First_Num: " << pair.first << std::endl;
        std::cout << "Second_Num: " << pair.second << std::endl;
    }
};
 
class B: public A
{
public:
 
    B(double x, const std::pair<int, int> &y) : field1(x) , pair(y) { };
       // методы
    virtual const std::pair<int, int> &getPair() override 
    {
        return pair;
    }
 
protected: 
    double field1;      // одно поле вещественного типа,
     std::pair<int, int> pair;         // а второе поле пара целых чисел      
 
};
 
int main()
{   
    A  *obj = new B(1, {2, 3});      //конструктор от родителя (от A) унаследован
    obj->getPair();     // свой (от B) переопределён
    obj->showComplexNum();    // от родителя (от A) унаследован
    return 0;
}
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.06.2020, 19:22
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
1
2
virtual const std::pair<int, int> &getPair() override 
 {  return pair; }
вот уже и с return'ом - что-то у меня не проходило раньше... и за все & спасибо...
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
ощущение, что в задании перепутаны классы A и B. Ты уверена, что оно правильное?
это не моё - поэтому нет... залезла в код для тренировки... первый раз разбиралась с наследованием - не хочу его очень много городить в рабочем проекте - т.к. все переопределения имеют место в Runtime... - думается мне, лучше всю работу кода оставлять на compile-time по возможности... в run-time -- если уж слишком сильно понадобиться декомпозировать... пока не претендую на написание таких больших классов, чтобы захотелось выделять наследников... а вот по функциональности - ещё думаю иногда, каких общих предков, может, выделить -- если потомки примерно одинаковые, но всё-таки разные... но не хочу всё оставлять на runtime... имхо... поэтому классы ковыряю для общего развития... спасибо за ответы!.. может, со временем и проникнусь ими...
(когда разберусь со ссылками & в них и на них)
0
14.06.2020, 23:29

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
конструктор родительский, а геттер у потомка свой от того, что сконструировал родитель... даже не знаю, где от такого пользу можно получить... так размазать на 2 класса создание объекта и его использование?
Это вы к чему написали? Мой комментарий касался не вашего ответа, а всей темы в целом.

0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
15.06.2020, 08:17
Цитата Сообщение от JeyCi Посмотреть сообщение
A *obj = new B(1, {2, 3}); //конструктор от родителя (от A) унаследован
и я не про свой ответ, а про зону применимости задачи в практических целях...


Добавлено через 11 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
A *obj = new B(1, {2, 3}); //конструктор от родителя (от A) унаследован
а с Конструкторами, действительно, вообще отдельная история
Стоит учитывать, что конструкторы при наследовании не наследуются. И если базовый класс содержит только конструкторы с параметрами, то производный класс должен вызывать в своем конструкторе один из конструкторов базового класса
Добавлено через 6 минут
вообще, при
Цитата Сообщение от JeyCi Посмотреть сообщение
using A::A;
- в наследнике, может, и Конструктор наследника не нужен может быть?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.06.2020, 10:25
Цитата Сообщение от JeyCi Посмотреть сообщение
- в наследнике, может, и Конструктор наследника не нужен может быть?
Это не "наследование конструкторов" - это декларация в классе B методов из класса A. Раньше нужно было вручную их все переписывать, типа
C++
1
2
3
4
B(double x, const Pair &y) 
: A(x, y) 
{ 
}
Но, как ты видишь, это чисто механическая работа и компилятор может сам справится с этим, но нужно это явно продекларировать при помощи using.
Это касается не только конструкторов, но и всех методов и данных. В частности, можно поменять их видимость в наследнике, public или private, не переписывая их
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
15.06.2020, 13:18
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В частности, можно поменять их видимость в наследнике, public или private, не переписывая их
хотела спросить:
если мы декларируем все методы и поля через using, то все они уже доступны, как были в родителе... значит, снова их описывать надо, чтобы сменить зону видимости?
а DrOffset уже ответил тут:
C++
1
2
3
4
5
6
7
8
9
10
11
class A 
{
public:
  int func();
}
 
class B : public A
{
private:
    using A::func;
}
значит, декларация через using - это сила! краткости и лаконичности по коду... всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2020, 13:18
Помогаю со студенческими работами здесь

Иерархия классов
Определить иерархию ИТ-специалистов, для дальнейшего составления из них команды. Нужна лишь идея, спасибо за помощь!

Иерархия классов
Создать класс хвост, имеющий в качестве параметров длину и вид(строка). Определить конструкторы и метод доступа. Создать класс хвостатое...

Иерархия классов
Доброво времини суток! Нужна помощ, я не могу понять что я делаю не так в конструкторе с парамитрами производного класса. #include...

Иерархия классов
Haskell platform 2014.2 Я так понимаю, в этой платформе используется новый стандарт Haskell 2010. Есть ли у кого информация о...

иерархия классов
Разработать иерархию классов, описывающих следующие понятия Растение- Дерево , лес что делать вообще не представляю((


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью 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" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru