Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

5.1.3. Последовательность вызова конструкторов

При создании экземпляра класса Lens будет вызван сначала конструктор базового класса (Detail()) и только после этого конструктор класса Lens(). При разрушении экземпляра класса Lens деструкторы будут вызваны в обратном порядке: сначала - деструктор ~Lens(), а затем - ~Detail().

В полном конструкторе (конструкторе копии) наследника обязательно нужно вызывать соответствующий конструктор (полный или копии) базового класса. Если этого не сделать, то компилятор вызовет конструктор по умолчанию для базового класса. Если и его нет, то компилятор выдаст сообщение об ошибке.

5.1.4. Типы наследования. Видимость членов классов

Возможно наследование нескольких типов – public, protected и private:

  • class X : public Y В этом случае наследник является подтипом и должен выполнять все обязательства родителя. Допустимо преобразование X* в Y*

  • class X : private Y Наследуя структуру и поведение родителя, наследник не будет его подтипом. public и protected члены родителя станут private членами наследника. Преобразование X* в Y* допустимо для друзей и членов X . Последующее наследование не имеет смысла.

  • class X : protected Y Наследуя структуру и поведение, наследник не будет подтипом. public и protected члены родителя станут protected членами наследника. Преобразование X* в Y* допустимо для членов и друзей и наследников X

При этом доступ к переменным-членам базового класса будет определяться не только типом видимости членов класса (раздел 4.2.3), но и типом наследования. В таблице показано какой тип доступа будет к членам базового класса, в зависимости от их типа и типа наследования.

 

public (открытые)

protected (защищенные)

private (закрытые)

public-наследование

public

protected

недоступны

protected-наследование

protected

protected

недоступны

private-наследование

private

private

недоступны

5.1.5. Множественное наследование

Множественное наследование – это наследование свойств одновременно от двух базовых классов. Например, класс Сферическое зеркало может одновременно наследовать свойства от классов Сферическая поверхность и Зеркало.

Если класс Child наследуется от двух базовых классов ( Base1 и Base2), то в классе Child будет возможность использования параметров из обоих базовых классов. При создании экземпляра класса Child конструкторы будут вызваны в следующей последовательности: Base1(), Base2() и только после этого конструктор класса Child().

При разрушении экземпляра класса Child деструкторы будут вызваны в обратном порядке: сначала - деструктор ~Child(), затем - ~Base2(), а затем ~Base1().

class Base1

{

protected:

double m_param1;

public:

Base1();

~Base1();

};

class Base2

{

protected:

double m_param2;

public:

Base1();

~Base1();

};

class Child : public Base1, public Base2

{

public:

Child();

~Child();

};