Всем привет, посоветуйте каким способом можно решить данную задачу:
Есть такая иерархия классов
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 таскать не хочеться.
Надеюсь понятно объяснил. Какие еще варианты возможны или как улучшить эти?
Заранее спасибо.