Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
1

Как правильно реализовать множественное наследование?

15.09.2016, 22:59. Показов 3209. Ответов 32
Метки нет (Все метки)

Всем привет. Нужна помощь. Вот смотрите. Имеется простой класс. От него порождаются два класса-наследника. А от этих двух классов порождается один класс. Так скажем, наследник третьего поколения. В каждом классе имеется метод Show() для отображения данных класса. Я сейчас их вам представлю.
Метод Show() базового класса:
C++
1
2
3
4
5
void Person::Show()
{
    cout << "Имя: " << name << endl;
    cout << "Фамилия " << lastname << endl;
}
Метод Show() первого класса 2-го поколения:
C++
1
2
3
4
5
6
void Sniper::Show()
{
    Person::Show();
    cout << "Время приведения в боевую готовность: " << Draw() << endl;
    cout << "Насечек: " << nas << endl;
}
Draw() выводит рандомное число.
Метод Show() второго класса 2-го поколения:
C++
1
2
3
4
5
void Poker::Show()
{
    Person::Show();
    cout << "Он достал карту: " << Draw() << endl;
}
Метод Show() класса 3-го поколения я написать не могу. Он должен вывести данные базового класса, также данные двух потомков (Там в принципе одна переменная класса Sniper), а также числа от двух методов Draw() (Один от одного предка, один от другого). Это можно сделать без проблем, если вписать все туда вручную типа так:
C++
1
2
3
4
5
6
7
void Bad::Show()
{
    Person::Show();
    cout << "Время приведения в боевую готовность : " << Sniper::Draw() << endl;
    cout << "Насечек: " << Sniper::nas << endl;
    cout << "Он достал карту: " << Poker::Draw() << endl;
}
Но как это можно сделать более удобнее?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2016, 22:59
Ответы с готовыми решениями:

Множественное наследование(правильно ли...образец)
В книге Павловская Т.А. нарвался на такой код #include &lt;iostream&gt; using namespace std; ...

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

Множественное наследование
Добрый вечер! Выполняю дом. работу в плюсах по ООП. Не могу разобраться с реализацией функций. ...

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

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
32
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 23:03 2
Цитата Сообщение от Саша Перков Посмотреть сообщение
Но как это можно сделать более удобнее?
Множественное наследование - это зло. И в 99% не правильная архитектура.
1
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
15.09.2016, 23:08  [ТС] 3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Множественное наследование - это зло. И в 99% не правильная архитектура.
Настолько зло, что не надо учиться им пользоваться? Я просто новичок в программировании и не особо разбираюсь в том, что стоит учить, а что нет.
0
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 23:11 4
Саша Перков, ну опишите, что вы пишите и придумаем архитуктуру. Если новичек, то может быть вы не знакомы с интерфейсами? А множественное наследовании у Снайпера - это котопёс?)
0
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,247
Записей в блоге: 1
15.09.2016, 23:12 5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Множественное наследование - это зло. И в 99% не правильная архитектура.
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
#include <iostream>
  
class FahrenheitSensor
{
  public:
    float getFahrenheitTemp() {
      float t = 32.0;
      // ... 
      return t;
    }
  protected:
    void adjust() {} // Настройка датчика (защищенный метод)
};
  
class Sensor
{    
  public:
    virtual ~Sensor() {}
    virtual float getTemperature() = 0;
    virtual void adjust() = 0;
};
  
class Adapter : public Sensor, private FahrenheitSensor
{    
  public:
    Adapter() { }
    float getTemperature() {
      return (getFahrenheitTemp()-32.0)*5.0/9.0;
    }
    void adjust() {
      FahrenheitSensor::adjust(); 
    }    
};
  
int main()
{
  Sensor * p = new Adapter();
  p->adjust();
  cout << "Celsius temperature = " << p->getTemperature() << endl;
  delete p;    
  return 0;
}
Красиво, же. Про 99 процентов ты наверно загнул.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
15.09.2016, 23:14  [ТС] 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Саша Перков, ну опишите, что вы пишите и придумаем архитуктуру. Если новичек, то может быть вы не знакомы с интерфейсами? А множественное наследовании у Снайпера - это котопёс?)
Вот такое у меня задание.
0
Миниатюры
Как правильно реализовать множественное наследование?  
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 23:25 7
_stanislav, вы же понимаете, что у вас в коде не множественное наследование, а тот способ реализации интерфейса в С++ ?

Добавлено через 9 минут
Саша Перков, задание плохое... Draw() возвращает число от 1 до 52 - где логика между именем функции и возвращаемым значением?) Давай я тебе лучше задание придумаю на эту тему?
0
hoggy
15.09.2016, 23:36
  #8

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Множественное наследование - это зло. И в 99% не правильная архитектура.
подобного рода заявления нуждаются в четкой аргументации,
с примерами-иллюстрациями возможных проблем.

на практике множественное наследование применяется сплошь и рядом.
и как то я не наблюдал никаких особых проблем.

теперь представьте себе, что вам нужно изготовить подсистему для некоторой эко-системы.
для этого нужно реализовать интерфейс:

C++
1
2
3
4
struct system_custom: basic_system
{
 ... // basic_system`s implementations
};
однако ваша подсистема обладает особенностью:
она хочет получать сообщения от клавиатуры и мышки,
и уметь на них реагировать.

с множественным наследованием проблем нет:

C++
1
2
3
4
5
6
7
8
9
struct system_custom
    :basic_system
    ,listener_keyboard
    ,listener_mouse
{
    ... // basic_system`s implementations
    ... // keyboard reactions
    ... // mouse reactions
};
при желании, систему можно расширять по горизонтали,
подписывая её на всевозможные обновления, и тп.

как вы это все сделаете без множественного наследования?
я понимаю, что можно.
вопрос в том: насколько сильно усложнится ваш код.
и насколько больше всякого инфраструктурного кода придется написать.

0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
15.09.2016, 23:39  [ТС] 9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
задание плохое... Draw() возвращает число от 1 до 52 - где логика между именем функции и возвращаемым значением?) Давай я тебе лучше задание придумаю на эту тему?
А чем плохо это задание? Я, конечно, буду не против задания, но просто это задание как раз сделано так, чтобы я применил знания именно из той главы, которую прочитал. Я лишь хочу узнать, как совместить два метода Show() из двух классов предков.
0
Эксперт С++
8421 / 3954 / 866
Регистрация: 15.11.2014
Сообщений: 8,904
15.09.2016, 23:43 10
Цитата Сообщение от Саша Перков Посмотреть сообщение
А чем плохо это задание?
я дочитал до слова Draw(), которое не имеет никакого отношения к рисованию,
и решил забить на этот бред)

Цитата Сообщение от Саша Перков Посмотреть сообщение
как совместить два метода Show() из двух классов предков.
C++
1
2
3
4
5
void der::show() const
{
    basic1::show();
    basic2::show();
}
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
15.09.2016, 23:46  [ТС] 11
Цитата Сообщение от hoggy Посмотреть сообщение
я дочитал до слова Draw(), которое не имеет никакого отношения к рисованию,
и решил забить на этот бред)
Причем тут название? Оно может быть абсолютно любым. Очень бредовая логика.
Насчет вашего кода, мне мало что понятно в нем. Можете предоставить гайд или еще что-либо, где описывается что такое der, basic1 и basic2.
0
rikimaru2013
15.09.2016, 23:53
  #12

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
подобного рода заявления нуждаются в четкой аргументации,
Я включил свой опыт, прочитанные статьи и здравый смысл) Под рукой только ссылки:
https://google.github.io/style... nheritance
http://stackoverflow.com/quest... tance-in-c

Цитата Сообщение от hoggy Посмотреть сообщение
с примерами-иллюстрациями возможных проблем.
Если ТС спросит - будем развивать тему - чего сразу все козыря в рукаве показывать?)

Цитата Сообщение от hoggy Посмотреть сообщение
на практике множественное наследование применяется сплошь и рядом.
и как то я не наблюдал никаких особых проблем.
В вашей практике. Вы тоже пишите класс Снайпера через множественное наследование?

Цитата Сообщение от hoggy Посмотреть сообщение
как вы это все сделаете без множественного наследования?
Проблема в том, что если я называю холодильник скатертью - то и в моей речи будет это слово. Если класс реализует интерфейс в С++ - для меня это не множественное наследование. Я так ставлю формулировку термина. Возможно вы со мной не согласитесь. Говорить в С++, я унаследовался от интерфейса - это срыв покров, что С++ не как не может сделать ключевое слово интерфейс.

Мои рекомендации - 1 родитель ( полноценный класс или абстрактный класс) и сколько угодно реализаций интерфейса. У ТСа у Снайпера 2 родителя вроде бы Человек и Стрелок. Я предлагаю ему не использовать множественное наследование, так как оно тут не уместно.

И случаи бывают разные в С++, вы явно говорите о тех случаях до которых мне расти и расти. Следовательно объясню ТСу - "в 99% случаев, что я встречал не нужно множественное наследование". Так будет лучше?

0
Selot
15.09.2016, 23:54
  #13

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
я дочитал до слова Draw(), которое не имеет никакого отношения к рисованию,
и решил забить на этот бред)
Draw - не "рисование" в этом контексте, это "ничья":)

0
Эксперт С++
8421 / 3954 / 866
Регистрация: 15.11.2014
Сообщений: 8,904
15.09.2016, 23:54 14
Цитата Сообщение от Саша Перков Посмотреть сообщение
Оно может быть абсолютно любым
нет. не может.
если хотите состояться как программист - вам придется это понять.
исходной код - это мысли программиста.
его можно читать, как книгу.

но когда в книге написан бред (отсутствует логика в повествовании),
то читать такую книгу уже не хочется.
нафиг нужно тратить время на всякий бред.

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

но вы же не предоставили моральный пример,
который содержит все необходимое для иллюстрации вашей проблемы:
инклюды, ваши классы, функцию main,
пример использования экземпляров ваших классов,
и тп.

а дописывать за вас все эти необходимые для успешной компиляции запчасти мне влом.
1
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 23:56 15
Цитата Сообщение от Саша Перков Посмотреть сообщение
Причем тут название? Оно может быть абсолютно любым.
нет не может. Вот пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct DFMmfdfdfgdfgdfg
{
    int _dfosdjfoksdmfsdkopf;
 
    int flksjdofmsdofmsdklfmskfml();
    void sdfjksdnfjksdnofsdmopfpsdjkfpsdf();
};
 
int main()
{
    DFMmfdfdfgdfgdfg sdfmksdfjkpsfmkpsdfsd;
    if ( sdfmksdfjkpsfmkpsdfsd.flksjdofmsdofmsdklfmskfml )
    {
        sdfmksdfjkpsfmkpsdfsd.sdfjksdnfjksdnofsdmopfpsdjkfpsdf();
    }
}
0
hoggy
16.09.2016, 00:07
  #16

Не по теме:

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

а его вы покамест никак не аргументировали.



Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вы тоже пишите класс Снайпера через множественное наследование?
я не писал классов снайперов.

в простом случае, это единственный класс солдатиков,
экземплярам которого можно посетить различные ружбайки.

в более продвинутых случаях:
привет "компонентная система игровых сущностей".

а вот коммуникация между компонентами была реализована через статическую систему сообщений.
и вот здесь я использовал множественное наследование на полную катушку.
ни разу не пожалел о решении.

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

в примере выше я вам проиллюстрировал один из возможных кейсов:
система реализует интерфейс,
и в тоже время она является слушателем мышки и клавиатуры.
какие вы здесь видите проблемы?



0
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
16.09.2016, 00:10 17
Цитата Сообщение от Selot Посмотреть сообщение
Draw - не "рисование" в этом контексте, это "ничья"
Да там до фига значений, одно из них - "вытаскивать".
0
Эксперт С++
8421 / 3954 / 866
Регистрация: 15.11.2014
Сообщений: 8,904
16.09.2016, 00:13 18
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
int _dfosdjfoksdmfsdkopf;
17.6.4.3.2 Global names [global.names]
1 Certain sets of names and function signatures are always reserved to the implementation:
— Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase
letter (2.12) is reserved to the implementation for any use.
— Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.
я б не стал на вашем месте использовать подчеркивания перед именем.
0
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
16.09.2016, 00:16 19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
У ТСа у Снайпера 2 родителя вроде бы Человек и Стрелок. Я предлагаю ему не использовать множественное наследование, так как оно тут не уместно.
Ну, ромбовидное виртуальное почти в каждом учебнике рассматривается, это задание тоже для его изучения.
1
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
16.09.2016, 00:20 20

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
меня интересует именно ваше мнение,
Моё мнение - пробовал - не пошло - геморроя больше, чем приятности. Передать такого монстра с 2 родителями в функцию, что принимает и того и того родителя ссылки - неопределенно явно. Иметь 2 родителя и переживать, чтобы те случайно не имели методов setState, чтобы потом решать какой же из них? Нет спасибо) Усложняет ли код 2 родителя? Да. Есть ли вероятность, что при расширения 1 родителя - этот гибридный монстр не будет нуждаться в расширениях - легко, ведь он гибрид - у него лапы козы, а так он лось. И как бы козу ты не расширял - ему нужны только лапы.

Вот моё мнение. Да тут нужно кода и примеров - но блин час ночи, а тема холливарная по определению.

Цитата Сообщение от hoggy Посмотреть сообщение
привет "компонентная система игровых сущностей".
Не понял о чём вы. Но ключевое слово "игровой" увидел - заинтересовали)

Цитата Сообщение от hoggy Посмотреть сообщение
какие вы здесь видите проблемы?
Да нету там проблем, но ведь слушатель тоже интерфейс. Мы гарантируем, что будет иметь методы OnMousePress( const Point2D& mouse_pos );
Так, что или я не понял чем ваш код должен меня удивить или код не удачный пример, который вы хотели показать



Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
я б не стал на вашем месте использовать подчеркивания перед именем.
мой стиль m_name; - но про подчёркивание в имени переменной класса, которую никто не увидит вне класса. Моё мнение? _name допустимая запись.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2016, 00:20

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Множественное наследование
Возник вопрос по теме множественное наследование. Вот скажем у нас определены классы: class...

Множественное наследование
Всем привет. Не могу понять следующий подход. Объясните немного, дальше я сам разберусь. Есть...

Множественное наследование
Здравствуйте! Делаю следующее задание по подготовке к экзамену по С++. Пока только начал....

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


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

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

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