Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Oryel
11 / 1 / 0
Регистрация: 02.10.2015
Сообщений: 98
#1

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

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

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

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

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

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

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

Множественное наследование - C++
Друзья прошу помочь разобраться, как получить доступ из массива J, к методу (O) из класса (С) #include <iostream> using...

Множественное наследование - C++
Листинг: #include <iostream> using namespace std; class Person{private: string Fname,Sname,years;}; class Student{private:...

Множественное наследование - C++
Так как у меня эта тема заняла долгое время для изучения ,выкладываю простой пример для освоения #include<iostream> using namespace...

множественное наследование - C++
разработайте алгоритм и создайте программы с применением множественного наследования. При выполнении данного задания необходимо создать не...

Множественное наследование - C++
Доброй ночи!:) вот условие http://www.imagepost.ru/images/1/5n/15n_1.jpg каждом класс должен содержать инициализирующие...

множественное наследование - C++
Почему не компилируется код? #include <iostream> #include <conio.h> #include <string.h> using namespace std; class...

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

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

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

большое количество динамик_кастов - признак ущербной архитектуры.
и да, он тормозной.
не желательно его применять там, где важна скорость.
1
shilko2013
244 / 221 / 118
Регистрация: 02.04.2016
Сообщений: 855
Завершенные тесты: 1
29.07.2016, 15:41 #7
hoggy, Я о том же
1
Oryel
11 / 1 / 0
Регистрация: 02.10.2015
Сообщений: 98
01.08.2016, 11:27  [ТС] #8
Ну дык сюда я и написал, чтобы не вредные советы дали, а дали направление/совет, как конструкцию можно упростить.
0
Mr.X
Эксперт С++
3052 / 1697 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2016, 11:45 #9
Цитата Сообщение от shilko2013 Посмотреть сообщение
Почитайте про множественное наследование
Судя по вопросу, автор применил этот термин по ошибке.
Цитата Сообщение от Oryel Посмотреть сообщение
я решил пока что dynamic_cast привести в одном месте...
А это еще к чему при виртуальных функциях?
0
notAll
431 / 153 / 37
Регистрация: 27.05.2016
Сообщений: 413
Завершенные тесты: 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 / 107
Регистрация: 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
2443 / 1136 / 240
Регистрация: 30.11.2013
Сообщений: 3,696
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
Привет! Вот еще темы с ответами:

Множественное наследование - C++
Добрый день. У меня имеется базовый класс A. У этого класса есть несколько наследников. Есть еще один класс B, который является...

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

множественное наследование - C++
Мечтаю реализовать такую иерархию human-&gt;employee-&gt;doctor в реализации doctor ругает конструктор. Ошибка 1 error C2062: type 'char'...

Множественное наследование в С++ - C++
Столкнулся с такой проблемой: class D{ ... public: ... void setD(); ... }; class Dd : public D{ ...


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

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

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