Форум программистов, компьютерный форум CyberForum.ru

Множественное наследование - когда оно действительно нужно? - C++

Восстановить пароль Регистрация
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
01.08.2014, 11:57     Множественное наследование - когда оно действительно нужно? #1
Здравствуйте!

До изучения языка C++ я программировал на языках типа Java и C#, где множественное наследование от классов явно запрещено. Долгое время после я обходился без этой возможности. Много тем в учебниках, где обсуждалось множественное наследование, были сопровождены примерами, но мне всегда казалось, что это можно выстроить гораздо красивее и логичней, совершенно не используя множественное наследование.

Однако, в моем проекте мне потребовалось реализовать интерфейс к неким классам-сервисам (BaseService), и некоторым производным требуются интерфейс, который позволил бы обновление сервиса (virtual void update() = 0), а другим - регистрацию в некоторой системе. Иногда необходимо совмещать эти два параметра. И вопрос - это как раз тот случай, когда множественное наследование действительно важно и полезно?

Прошу привести пару примеров из реальной жизни, когда данная возможность действительно необходима.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2014, 11:57     Множественное наследование - когда оно действительно нужно?
Посмотрите здесь:

C++ Множественное наследование
Множественное наследование C++
Множественное наследование C++
C++ Множественное наследование
Множественное наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
01.08.2014, 18:30     Множественное наследование - когда оно действительно нужно? #2
Какое совпадение.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
01.08.2014, 18:59     Множественное наследование - когда оно действительно нужно? #3
Nick Alte, ну не умеет человек пользоваться поиском. Только тут конкретный вопрос, а я холивары люблю.
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 09:31     Множественное наследование - когда оно действительно нужно? #4
relationer, множественное наследование наделяет объект свойсвами сразу нескольких сущностей иногда это полезно, иногда приводит к странным поведениям объекта. В целом если итоговый класс не планируется расширять в дальнейшем то множественное наследование как минимум сократит число виртуальных методов и облегчит взаимоействие объекта с разными участками кода.

Не по теме:

Цитата Сообщение от relationer Посмотреть сообщение
но мне всегда казалось, что это можно выстроить гораздо красивее и логичней, совершенно не используя множественное наследование.
- неправильно тебе казалось



Цитата Сообщение от relationer Посмотреть сообщение
Прошу привести пару примеров из реальной жизни, когда данная возможность действительно необходима.
- пожалуйста
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
#include <iostream>
using namespace std;
 
class cWnd
{
protected:
    bool   bEnable;
public:
    cWnd() : bEnable(1) {}
    void Enable(){bEnable = true;}
    void Disable(){bEnable = false;}
    bool IsEnable(){
        return bEnable;
    }
};
 
class cRect
{
public:
    int xmin;
    int xmax;
    int ymin;
    int ymax;
    cRect(){
        xmin = 0;
        xmax = 0;
        ymin = 0;
        ymax = 0;
    }
    bool PtInRect(int x, int y)
    {
        bool bInRect = false;
        if(xmin < x && x < xmax)
        if(ymin < y && y < ymax)
            bInRect  = true;
        return bInRect;
    }
};
 
class cControl : public cWnd, public cRect
{
    public:
    cControl() {
         bEnable = true;
    }
    void place(int xmin, int ymin, int xmax, int ymax){
        cRect::xmin = xmin;
        cRect::ymin = ymin;
        cRect::xmax = xmax;
        cRect::ymin = ymax;
    }
};
 
 
int main()
{
    cControl edit;
    edit.place(25, 36, 45, 73);
    cout<<(edit.PtInRect(5, 5) ? "yes" : "no")<<endl;
    cout<<(edit.IsEnable() ? "yes" : "no")<<endl;
    cin.get();
    return 0;
}
http://codepad.org/QlciSpw0
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 09:34     Множественное наследование - когда оно действительно нужно? #5
-=ЮрА=-, Ален Голуб бы вам за такой код руку не пожал.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
02.08.2014, 09:38     Множественное наследование - когда оно действительно нужно? #6
-=ЮрА=-, а это нормально, что я могу сделать так?
C++
1
2
cControl control = /* ... */;
cRect * rectangle = control;
Т.е. отношение классов выглядит не особо логично.

Добавлено через 2 минуты
Логичнее было бы, если бы у контрола была позиция, но то, что контрол - это прямоугольник...
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 09:40     Множественное наследование - когда оно действительно нужно? #7
Цитата Сообщение от gray_fox Посмотреть сообщение
-=ЮрА=-, а это нормально, что я могу сделать так?
Код C++
1
2
cControl control = /* ... */;
cRect * rectangle = control;
Т.е. отношение классов выглядит не особо логично.
- раз ты следуешь стандартам плюcов то юзай dynamic_cast который подскажит можно или нет. На счёт твоего примера, ну и?Ті привёл к ректу ну молодец. Лучше приведи к cWnd и пакуй в контейнер, потом доставай из него и кастуй к контролу. Если руки не из ж*пы всё получится.

Не по теме:

gray_fox, я привёл лишь пример, нарисуй свой и приведи человеку.

gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
02.08.2014, 09:45     Множественное наследование - когда оно действительно нужно? #8

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
gray_fox, я привёл лишь пример, нарисуй свой и приведи человеку.
В том то и дело, что я не припомню нормального примера множественного (public) наследования классов (не интерфейсов).



Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- раз ты следуешь стандартам плюcов то юзай dynamic_cast который подскажит можно или нет.
dynamic_cast тут вообще не при чём) Просто тут получается, что контрол - это прямоугольник, что как минимум странно)
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 09:53     Множественное наследование - когда оно действительно нужно? #9
Цитата Сообщение от gray_fox Посмотреть сообщение
dynamic_cast тут вообще не при чём)
- да что ты говоришь. Если бы прочёл мои слова
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
учше приведи к cWnd и пакуй в контейнер, потом доставай из него и кастуй к контролу. Если руки не из ж*пы всё получится.
понял бы зачем динамик каст

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
В том то и дело, что я не припомню нормального примера множественного (public) наследования классов (не интерфейсов).
- типичный ответ человека боящегося сделать шаг в сторону.
Цитата Сообщение от gray_fox Посмотреть сообщение
dynamic_cast тут вообще не при чём) Просто тут получается, что контрол - это прямоугольник, что как минимум странно)
- а что это по твоему для фона окна, для кликов мыши, для ректанглов отрисовки?



Добавлено через 3 минуты
Кликните здесь для просмотра всего текста
gray_fox, где то так мне приходится общаться с доброй половиной форума
http://www.youtube.com/watch?v=dijVbM9DpxU сейчас как раз тот экзамен...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
02.08.2014, 09:56     Множественное наследование - когда оно действительно нужно? #10

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а что это по твоему для фона окна, для кликов мыши, для ректанглов отрисовки?
Извини, я не понимаю, при тут это вообще. Мой вопрос: почему контрол - это прямоугольник? Я лично вижу только один вариант - меньше кода по сравнению с композицией/закрытым наследованием...



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
gray_fox, где то так мне приходится общаться с доброй половиной форума
Если не хочешь общаться, то давай не будем, я не настаиваю...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 10:41     Множественное наследование - когда оно действительно нужно?
Еще ссылки по теме:

Множественное наследование C++
Множественное наследование C++
Наследование , зачем оно нужно ? C++

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

Или воспользуйтесь поиском по форуму:
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 10:41     Множественное наследование - когда оно действительно нужно? #11
Почему вот здесь нельзя использовать композицию - ума не приложу. Контрол не есть прямоугольник, он скорее использует его. Да как и cWnd.

По поводу Голуба, читать ведь всем лень - с точки зрения оконной подсистемы любой графический элемент есть окно. Но это не значит, что нам всем срочно надо отнаследоваться от CWnd, а для любого переопределения поведения - ещё от десятка классов.
Yandex
Объявления
02.08.2014, 10:41     Множественное наследование - когда оно действительно нужно?
Ответ Создать тему
Опции темы

Текущее время: 01:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru