Здравствуйте IT, Вы писали:
ЮБ>>Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?
IT>В этом нет никакого смысла.
Может не поверишь, Игорь, но иногда небольшой смысл есть

. С virtual наследованием (хотя эта вещь закладывалась как раз для полиморфного наследования) можно делать вот такую вещь
class CA
{
public:
CA() : m_nA(0) { }
CA(int nA) : m_nA(nA) { }
protected:
int m_nA;
};
class CB : virtual public CA
{
public:
CB(int nB) : CA(nB), m_nB(nB) { }
protected:
int m_nB;
};
class CC : public CB
{
public:
CC() : CB(1), m_nC(1) { }
CC(int nC) : CB(nC), CA(nC), m_nC(nC) { }
protected:
int m_nC;
};
CC с0;
CC с1(1);
При виртуальном наследовании, в конструкторе наследника (любого уровня) мы должны указывать как инициализируется базовый виртуальный класс. Если в списке инициализации конструктора наследника, явно не указан конструктор базового виртуального класса, то будет использоваться конструктор по умолчанию (если такового нет, то компилятор выдаст ошибку). Таким образом, в наследнике любого уровня, легко можно проинициализировать базовый класс (в TurboVision было похожее использование виртуального наследования). Не спорю, что, то же самое можно сделать и без виртуального наследования, удобно это или нет, решать самому.
В моем примере после инициализации, объекты будут иметь следующие данные
c0 = {m_nA = 0, m_nB = 1, m_nC = 1 } // а не {m_nA = 1, m_nB = 1, m_nC = 1 } как может показаться
c1 = {m_nA = 1, m_nB = 1, m_nC = 1 }