Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Oryel
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
#1

Множественное наследование - C++

29.07.2016, 14:33. Просмотров 304. Ответов 11
Метки нет (Все метки)

Доброго времени суток.

Есть ряд операций. Логически операции делятся на группы ( к примеру, запрос, ответ, чтение из буфера и .п.). В зависимости от группы, появляется специализация ( у всех операций есть общие черты (наличие имени операции), общий метод, но у каждой группы есть свои спец. методы...к примеру, сформировать запрос).

В двух разных местах кода нужно обращаться к классам , как к нечто общему (все операции имеют общий метод operation), а в другом более узкому (каждая группа имеет свои операции ownOperation).

Т.е. я хочу так. Сделать абстрактный класс Операций. В нем реализовать самый общий интерфейс для всех операций.
Потом от него сделать наследование к другому асбтрактному классу, который уже более специализорованный и делит операции на группы. Каждой группе свой абстрактный класс, который они наследуют.

Вопрос такой. Будет ли это корректно работать?
И как обращаться к операциям. мне нужно получается в одном месте кода с одной и тоже операцией обратиться, как к общей операцией, а в другом месте уже как к специальной.
Через чей указатель работать? или иметь два указателя (общий и специализированный)?
т.е. оправил команду запроса. и в коде в одом месте я образаюсь к нему по общему интерфейсу, а вдругом по узкоспецилизированному..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 14:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Множественное наследование (C++):

Множественное наследование
Есть два класса Human(fname, lname) и класс Employee c чисто виртуальными функц...

Множественное наследование
Имеется множественное наследование в виде треугольника. Если в обоих базовых...

Множественное наследование
По этой схеме нужно сделать множественное наследование. Вот код:#include...

Множественное наследование
Как создать нового наследника из базового класса и наследника базового класса?

Множественное наследование
Добрый день. У меня имеется базовый класс A. У этого класса есть несколько...

Множественное наследование
Приветствую всех,хочу сказать сразу, что я не программист и не учусь на...

11
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
29.07.2016, 14:47 #2
Упрощю текст выше для читающих - он хочет класс Animal с методами void run(); и void eat(), но в то же время класс Dog должен иметь метод void gaf(), а класс Cat метод void meow()

ТСа интересует работать с указателем Animal* или иметь оба Animal + Dog/Cat - как ему динамик-кастить и будет ли такая архитектура - гавняной?*
1
shilko2013
249 / 226 / 184
Регистрация: 02.04.2016
Сообщений: 886
Завершенные тесты: 1
29.07.2016, 14:48 #3
Почитайте про множественное наследование и виртуальные функции на любом сайте)
1
Oryel
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
29.07.2016, 15:33  [ТС] #4
Спасибо за более простую интерпретацию моего вопроса .
я решил пока что dynamic_cast привести в одном месте...
0
shilko2013
249 / 226 / 184
Регистрация: 02.04.2016
Сообщений: 886
Завершенные тесты: 1
29.07.2016, 15:36 #5
Oryel, Что-что?

Добавлено через 38 секунд
юзай его везде и побольше, тогда программа летать будет
P.S //Вредные советы
1
hoggy
Заблокирован
29.07.2016, 15:37 #6
Цитата Сообщение от Oryel Посмотреть сообщение
dynamic_cast привести в одном месте
в одном месте - не страшно.
главное не злоупотреблять.

большое количество динамик_кастов - признак ущербной архитектуры.
и да, он тормозной.
не желательно его применять там, где важна скорость.
1
shilko2013
249 / 226 / 184
Регистрация: 02.04.2016
Сообщений: 886
Завершенные тесты: 1
29.07.2016, 15:41 #7
hoggy, Я о том же
1
Oryel
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
01.08.2016, 11:27  [ТС] #8
Ну дык сюда я и написал, чтобы не вредные советы дали, а дали направление/совет, как конструкцию можно упростить.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2016, 11:45 #9
Цитата Сообщение от shilko2013 Посмотреть сообщение
Почитайте про множественное наследование
Судя по вопросу, автор применил этот термин по ошибке.
Цитата Сообщение от Oryel Посмотреть сообщение
я решил пока что dynamic_cast привести в одном месте...
А это еще к чему при виртуальных функциях?
0
notAll
440 / 162 / 60
Регистрация: 27.05.2016
Сообщений: 439
Завершенные тесты: 2
01.08.2016, 11:55 #10
Цитата Сообщение от Oryel Посмотреть сообщение
(все операции имеют общий метод operation), а в другом более узкому (каждая группа имеет свои операции ownOperation)
Если я все правильно понял, то возможно это то что надо:
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
#include <iostream>
 
class NVI
{
    virtual void ownOperation() const
    {
        puts(__PRETTY_FUNCTION__);
    }
public:
    NVI() = default;
 
    void operation() const
    {
        puts("Some pre-work");
        ownOperation();
        puts("Some post-work");
    }
 
    virtual ~NVI() = default;
};
 
class Test1 : public NVI
{
private:
    void ownOperation() const override
    {
        puts(__PRETTY_FUNCTION__);
    }
};
 
class Test2 : public NVI
{
private:
    void ownOperation() const override
    {
        puts(__PRETTY_FUNCTION__);
    }
};
 
int main()
{
    NVI* arr[2] {new Test1(), new Test2()};
    arr[0]->operation();
    arr[1]->operation();
}
0
Nosey
1349 / 400 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
01.08.2016, 17:05 #11
rikimaru2013, Вы не против если я вам отвечу

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
 
struct Animal
{
    virtual void run()
    {
        std::cout << "run ";
    }
    virtual void eat()
    {
        std::cout << "eat ";
    }
};
 
struct Dog: Animal
{
    void gaf()
    {
        std::cout << "gaf ";
    }
};
 
struct Cat: Animal
{
    void meow()
    {
        std::cout << "meow ";
    }
};
 
#include <vector>
#include <memory>
 
struct Wood
{
    std::vector<std::shared_ptr<Animal>> inhabitants_;
    void RunForrestRun() //^^
    {
        for (auto& v : inhabitants_)
        {
            v->run();
        }
    }
    void EatForrestEat()
    {
        for (auto& v : inhabitants_)
        {
            v->eat();
        }
    }
};
 
struct LifeInWood
{
    Wood& wood_;
    std::vector<std::shared_ptr<Dog>> dogs_;
    std::vector<std::shared_ptr<Cat>> cats_;
 
    LifeInWood(Wood& wood)
            : wood_(wood)
    {
    }
 
    void doDogsLiveStep()
    {
        for (auto& v : dogs_)
        {
            v->gaf();
        }
    }
 
    void doCatsLiveStep()
    {
        for (auto& v : cats_)
        {
            v->meow();
        }
    }
};
 
struct WoodScene
{
    Wood wood_;
    LifeInWood lifeinWood_ { wood_ };
 
    void birthCat()
    {
        auto c = std::make_shared<Cat>();
        lifeinWood_.cats_.push_back(c);
        wood_.inhabitants_.push_back(c);
    }
 
    void birthDog()
    {
        auto c = std::make_shared<Dog>();
        lifeinWood_.dogs_.push_back(c);
        wood_.inhabitants_.push_back(c);
    }
 
    void doAll()
    {
        wood_.EatForrestEat();
        wood_.RunForrestRun();
        lifeinWood_.doCatsLiveStep();
        lifeinWood_.doDogsLiveStep();
    }
 
    WoodScene()
    {
        birthCat();
        birthCat();
        birthDog();
    }
};
 
int main()
{
    WoodScene scene;
    scene.doAll();
}
Т.е. использовать объект вы должны на том уровне абстракции на котором у вас достаточно данных.
dynamic_cast стараться избегать.
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
01.08.2016, 19:19 #12
Nosey, мне еще никогда не отвечали на "невопрос"
1
01.08.2016, 19:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2016, 19:19
Привет! Вот еще темы с решениями:

Множественное наследование
Листинг: #include &lt;iostream&gt; using namespace std; class Person{private:...

Множественное наследование
Задание Часть 1. Создать иерархию типов &quot;Точка&quot; и подчинённые ему &quot;Точка в...

Множественное наследование
// 4.1.cpp: главный файл проекта. #include &lt;stdafx.h&gt; #include &lt;iostream&gt;...

Множественное наследование
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string.h&gt; #include...


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

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

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