Re[8]: virtual base class для чего обычно юзается?
От: Sashko Россия http://www.dc.baika.ru/
Дата: 21.01.02 03:27
Оценка: 64 (12)
Здравствуйте 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 }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.