Что такое реальные примеры множественного наследования C++?

Помимо примеров из учебника - в реальном мире - когда-либо имеет смысл использовать множественное наследование (где больше чем один из базовых классов не является чистыми интерфейсами) в C++?

13
задан Jonas 13 September 2011 в 13:19
поделиться

6 ответов

Это очень часто встречается при использовании Policy-based design, например.

11
ответ дан 1 December 2019 в 22:57
поделиться

ИМО, это можно спорить. До появления шаблонов было довольно много случаев, которые это оправдывали. По сути, вы можете использовать базовые классы примерно так же, как классы политик с шаблонами. Например, рассмотрим такой шаблон:

template <typename policy1, typename policy2>
class whatever {
    policy1 p1;
    policy2 p2;
public:
    void dosomething() { if (p1.enquire()) p2.dosomething(); }
};

Если вы по какой-то причине не хотите использовать шаблоны, вы можете получить (некоторые) довольно похожие возможности с множественным наследованием:

class whatever : policy1, policy2 {   
    void dosomething() { if (enquire()) dosomething();  }

};

В обоих случаях вы ' re в основном встраивает экземпляр «политики» в ваш новый объект. Поскольку мы используем частное наследование, то LSP не имеет никакого отношения - как и в случае с шаблонами на основе политик, целью не является создание большой иерархии, которая утверждает что-либо об отношениях между членами иерархии - скорее, это просто о создании возможности создавать по запросу большое количество несвязанных классов.

2
ответ дан 1 December 2019 в 22:57
поделиться

Я использовал множественное наследование в "реальном мире" - на работе, где я занимался кодированием картографического приложения.

К сожалению, я не могу вспомнить точный пример, что меня невероятно расстраивает.

Тем не менее, вот интересная статья о том, какие моменты следует учитывать и какие альтернативные паттерны или решения можно использовать:

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.2

Мне нравится использование транспортных средств для примеров - особенно добавление транспортного средства-амфибии.

0
ответ дан 1 December 2019 в 22:57
поделиться

Множественное наследование определенно имеет свое место и может быть очень полезным. Как правило, базовый класс должен быть абстрактным, когда это возможно, то есть вы не должны иметь возможности создать из него объект, но ничто не мешает вам наследовать от конкретного класса. Несомненно, достоинством является и то, что вы можете использовать преимущества унаследованной реализации от базового класса. Пример в одном из ответов по iostream - хороший пример. Другим примером может быть моделирование сотрудника, который также является владельцем/директором бизнеса, и вы смоделируете его как

public class Director
{
   ................
   double CalculateDividend();
   bool ApproveBudget();
};

public class Employee
{
   ................
   double CalculateSalary();
};


public class WorkingDirector: Employee, Director
{
   ..............
};

Теперь объект WorkingDirector может делать то, что могут делать сотрудник и директор, что является идеальным в реальном мире. Нам даже не придется переписывать реализацию какого-либо метода.

Во многих случаях реализация паттернов проектирования также упрощается благодаря поддержке множественного наследования.

0
ответ дан 1 December 2019 в 22:57
поделиться

TinyMCE и подобные редакторы не подходят для нетехнических людей, которые, вероятно, испортят разметку. Особенно когда упомянутые нетехнические люди копируют отформатированный текст из слова в RTE на веб-странице, думая, что это самое естественное.

Если ваша аудитория технична, более подходит что-то вроде уценки (как используется здесь на SO).

Если они нетехнические, позвольте им использовать WYMeditor (WYM = то, что вы имеете в виду) и предоставить какой-то учебник/объяснение, чтобы они могли использовать его.

-121--2608906-

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

-121--2758810-

Проще всего указать на iostream , который наследует от istream и ostream . cin и cout являются istream и ostream соответственно, но fstream происходит от iostream .

4
ответ дан 1 December 2019 в 22:57
поделиться

ATL (Active Template Library) от Microsoft использует множественное наследование в виде классов mixin:

http://en.wikipedia.org/wiki/Active_Template_Library

3
ответ дан 1 December 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: