05.09.2016 Views

Стефан Р. - С++ Для чайников

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!