Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2012, 10:54   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Множественное наследование

Всем привет, столкнулся со следующей проблемой, как ее решить и как организовать правильное наследование?
Задача: Имеется 3 класса A, B, C, каждый класс содержит по методу и имеет следующую схему наследования, смотреть Figure 1.0.
Как же быть? Если мне в классе B нужно использовать метод класса A а в классе C метод класса A и B, притом то что класс B уже унаследовал класс A. Здесь собственно и вытекает сообщение компилятора об ошибке -> "is already a base-class of".

Figure 1.0
Код:
class A
{
public:
 MethodA() {};
};

class B : public A
{
 MethodB() {};
};

class C : public A, public B
{
 MethodC() {};
};

Последний раз редактировалось coNsept; 12.06.2012 в 11:08.
coNsept вне форума Ответить с цитированием
Старый 12.06.2012, 14:41   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

http://yandex.ru/yandsearch?text=%D1...1%2B%2B&lr=240

http://yandex.ru/yandsearch?text=%D0...1%2B%2B&lr=240
_Bers вне форума Ответить с цитированием
Старый 12.06.2012, 15:12   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас уже A внесен в иерархию, снова вносить не нужно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.06.2012, 16:27   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас уже A внесен в иерархию, снова вносить не нужно.
Автора интересуют механизмы, с помощью которых возможно разрешать подобного рода конфликты. И это правильная позиция.

Допустим, в будущем автор захочет создать архитектурные комплексы, которые будут автоматически разворачиваться используя магию шаблонов.
И тогда уже не получится думать "внести в иерархию", или "не внести". Ибо подобные метапрограммы выборки значительно усложнят код шаблонов.

Гораздо практичнее использовать механизмы разрешения подобного рода конфликтов, и цеплять в иерархии любые классы, в любых порядках и последовательностях наследования.

Последний раз редактировалось _Bers; 12.06.2012 в 16:35.
_Bers вне форума Ответить с цитированием
Старый 12.06.2012, 17:00   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Правильно, когда существует множественное количество классов с применением множественного наследования от одного класса к другому и т.д. и т.п. возникает сложность в иерархии, ты начинаешь забывать и задавать себе вопрос а можно ли унаследовать классу X, класс Y и не будет ли класс Y являться базовым классом уже какого-нить другого класса в случае если этот "другой класс" будет унаследован классу X тоже.
Поэтому я ищу различные механизмы обхода данной проблемы, чтобы на будущее написать какой либо класс и добавить его в свой проект там где он необходим и не заботится он том что изза него может возникнуть проблема "is already a base-class of".

Спасибо большое Вам Bers. Именно виртуальное наследование это то что мне нужно, только есть еще один момент который я не понял, методы должны объявляться виртуальными обязательно или нет?

Последний раз редактировалось coNsept; 12.06.2012 в 17:23.
coNsept вне форума Ответить с цитированием
Старый 12.06.2012, 17:18   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
только есть еще один момент который я не понял, методы должны объявляться виртуальными обязательно или нет?

Неет. Полиморфизм (виртуальные функции) не имеют никакого отношения к виртуальному наследованию. Там хоть и используется одинаковое ключевое слово virtual, но оно в разных контекстах трактуется по разному.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множественное наследование в C# Mixim C# (си шарп) 15 14.03.2012 19:43
[с++] Множественное наследование huichos Общие вопросы C/C++ 3 16.12.2011 18:25
Множественное наследование Jugger Помощь студентам 2 09.12.2011 20:23
Множественное наследование С++ добрый_фей Помощь студентам 1 13.06.2011 14:31
Множественное наследование Crucian Общие вопросы Delphi 1 29.12.2008 14:26