Показать сообщение отдельно
Старый 24.11.2009, 22:27   #1
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Виртуальное наследование

Всем привет, посоветуйте каким способом можно решить данную задачу:
Есть такая иерархия классов
cBase -> cElem1 -> cElem2 -> cElem...
cBase -> cElem11 -> cElem12 -> ...
...
cBase -> cPrimary
Необходима возможность создать класс на основе cPrimary и любого из cElem, т.е.
cPrimary + cElemN -> cPrimElem
Класс cPrimary основан на базовом классе, для возможности доступа к его функциям и для переопределения пары виртуальных функций (которые переопределяются только в cPrimary).

1) Для этой цели вполне бы подошло виртуальное наследование, однако есть небольшое НО. Если базовый класс имеет только параметризованные конструкторы, то этот самый конструктор придется вызывать в каждом классе, имеющем в основе базовый класс.
Это не совсем удобно и в некоторых случаях не допустимо.
Например в цепочке "cBase -> cElem1 -> cElem2" конструктор класса cElem2 может просто не знать всех параметров необходимых конструктору базового класса.

Можно ли как-то избавиться от необходимости вызывать конструктор базы из каждого класса?

2) Второй вариант - не основывать cPrimary на cBase, а передать ему указатель на нее.
class Base {
   void draw();
}
class Primary {
   Base* base;
   Primary(Base* b) { base = b; }
}
class Elem : Base(), Primary(this) {}

func(Primary* prim) {
   prim->base->draw()
}

Elem MyElem;
func(MyElem);
Но как быть с переопределением виртуальных функций базового класса в этом случае?

3) Встроить cPrimary в базовый класс с переменной отвечающей за вкл/выкл cPrimary. Наиболее просто, но базовый класс итак громоздкий, да и лишние переменные для классов не использующих cPrimary таскать не хочеться.

Надеюсь понятно объяснил. Какие еще варианты возможны или как улучшить эти?
Заранее спасибо.
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием