Каковы реальные примеры множественного наследования C ++? - PullRequest
13 голосов
/ 23 февраля 2010

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

Ответы [ 6 ]

11 голосов
/ 23 февраля 2010

Это очень распространено, например, при использовании Основанного на политике дизайна .

4 голосов
/ 23 февраля 2010

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

3 голосов
/ 23 февраля 2010

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

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

2 голосов
/ 23 февраля 2010

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

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();  }

};

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

0 голосов
/ 23 февраля 2010

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

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

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


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

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

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

0 голосов
/ 23 февраля 2010

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

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

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

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

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

...