Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
1. Сначала вызываются конструкторы для каждого виртуального базового<br />
класса в порядке наследования.<br />
2. Затем вызываются конструкторы каждого невиртуального базового класса<br />
в порядке наследования.<br />
3. После этого вызываются конструкторы всех объектов-членов класса в том<br />
порядке, в котором эти объекты-члены объявлены в классе.<br />
4. И наконец, вызывается конструктор самого класса.<br />
Обратите внимание, что базовые классы конструируются в порядке наследования,<br />
а не в порядке расположения в строке конструктора.<br />
О^Щгицшнельные ано/гоны<br />
множественного наслеуовшшл<br />
Должен признаться, что не все. кто работает с объектно-ориентированным программированием,<br />
считают механизм множественного наследования удачным. Кроме<br />
того, многие объектно-ориентированные языки вообще не поддерживают множественного<br />
наследования, реализация которого, кстати, далеко не самая простая вешь.<br />
Конечно, множественное наследование — это проблема компилятора (вернее, того,<br />
кто пишет компилятор). Однако оно требует больших накладных расходов по сравнению<br />
с программой с обычным наследованием, а эти накладные расходы становятся<br />
уже проблемой программиста.<br />
Не менее важно и то, что множественное наследование открывает путь к дополнительным<br />
ошибкам. Во-первых, неоднозначность, подобная описанной в предыдущем<br />
разделе, может превратиться в большую проблему. Во-вторых, при наличии множественного<br />
наследования преобразования указателя на подкласс в указатель на базовый<br />
класс иногда приводят к запутанным и непонятным изменениям этого указателя. Все<br />
эти тонкости я оставляю на совести разработчиков языка и компилятора, но хочу<br />
продемонстрировать программу, которая из-за этого может привести к непредсказуемым<br />
результатам:<br />
Sinclude iiostream.h><br />
class Вазэ! (int mem;};<br />
class Base2 (int mem;);<br />
class Subclass : public Basel, public Base2 {};<br />
void fn(Subclass' pSC)<br />
{<br />
Basel* pBX = (Basel*)pSC;<br />
Base2 * pB2 - (Base2 T )pSC;<br />
if