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

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

Войти
Регистрация
Восстановить пароль
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
#1

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

01.08.2014, 11:57. Просмотров 466. Ответов 10
Метки нет (Все метки)

Здравствуйте!

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

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

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

Наследование , зачем оно нужно ? - C++
Добрый день , который день бьюс с темой Добавлено через 3 минуты Понимаю что можно создавать классы окон в Windows от родительского...

Множественное наследование - C++
По этой схеме нужно сделать множественное наследование. Вот код:#include <iostream> #include <conio.h> #include <string> using...

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

Множественное наследование - C++
Здравствуйте, всем! Я на этом форуме впервые. Пытаюсь изучать С++ самостоятельно. Литература некоторая имеется. Начал изучение с...

Множественное наследование - C++
Описать два базовых класса с защищенной переменной типа char (в первом - фамилия, во втором - имя). В первом из них описать функцию...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
01.08.2014, 18:30 #2
Какое совпадение.
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
01.08.2014, 18:59 #3
Nick Alte, ну не умеет человек пользоваться поиском. Только тут конкретный вопрос, а я холивары люблю.
0
-=ЮрА=-
Заблокирован
Автор 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
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 09:34 #5
-=ЮрА=-, Ален Голуб бы вам за такой код руку не пожал.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
02.08.2014, 09:38 #6
-=ЮрА=-, а это нормально, что я могу сделать так?
C++
1
2
cControl control = /* ... */;
cRect * rectangle = control;
Т.е. отношение классов выглядит не особо логично.

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

Не по теме:

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

0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
02.08.2014, 09:45 #8

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- раз ты следуешь стандартам плюcов то юзай dynamic_cast который подскажит можно или нет.
dynamic_cast тут вообще не при чём) Просто тут получается, что контрол - это прямоугольник, что как минимум странно)
0
-=ЮрА=-
Заблокирован
Автор 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 сейчас как раз тот экзамен...
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
02.08.2014, 09:56 #10

Не по теме:

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



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

Не по теме:

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

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

По поводу Голуба, читать ведь всем лень - с точки зрения оконной подсистемы любой графический элемент есть окно. Но это не значит, что нам всем срочно надо отнаследоваться от CWnd, а для любого переопределения поведения - ещё от десятка классов.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 10:41
Привет! Вот еще темы с ответами:

Множественное наследование - C++
Помогите пожалуйста написать программу.

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

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

Множественное наследование - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; using namespace std; class ship { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2014, 10:41
Ответ Создать тему
Опции темы

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