Программирование >>  Расширенная версия языка c++ 

1 ... 71 72 73 [ 74 ] 75 76 77 ... 227


228 Самоучитель , G** --- . .

class B2 {

int b; . ,

public:

) ( cou..--., Работа конструктора класса n ; } ) { cou..4 Работа деструктора класса n ; )

Наследование двух базов1х классов

class D: public Bl, public В2 f , : -

public:

D() { cou Работа конструктора класса n ; } ~D() { couc: Работа деструктора класса n ; }

D ob;

return 0;

Эта программа выводит на экран слеющее:

Работа конструктора класса В1 Работа конструктора класса Работа конструктора класса D Работа деструктора класса D Работа деструктора класса В2 Работа деструктора класса В1

Как уже установлено, когда прямо наслеются несколько базов1х классов, конструкторы вызываются слегка направо в порядке, задаваемом списком. Деструкторы вызываются в обратном порядке.

>

нения

1. Что выводит на экран следующая программа? (Попытайтесь определить это, не запуская программу,)

ttinclude <iostreain>

using namespace std; - i .

public:

A() { cou << Работа конструктора класса Мп ; } ~-А() { cou << Работа деструктора класса п ; }



class C: public A, public В {

int к; ; .1

public:

/* Создайте такой конструктор с чтобы он ИЕОЩиализировал

переменную k и передавал аргументы конструкторам А() и ВО */

7.. Виртуальные базовые классы

При многократном прямом наследовании производным классом одного и того же базового класса может возникнуть проблема. Чтобы понять, что это за проблема, рассмотрим следующую иерархию классов:

class В { t,

public:

В() { cou Работа конструктора класса Mn ; } ~В() { cou . Работа деструктора класса п ; }

}; . , , . , . .

class С: public A, public В ( public:

С{) { cout Работа конструктора класса С\п ,- } ~С() { cou Работа деструктора класса п ; }

int main О

С ob; : . .. .м- ,

return 0; ... 1 ,. ,

)

2. Используя следующую иерархии сов, создайте конструктор класса С так, чтобы он инициализировал переменную k и передавал аргументы конструкторам А() и В().

linclude <iostream> ,. о : ; ;.

using namespace std; . i - . ,

class A { .

int i; :

public: - -

A (int a) { i = a; } .-.c \

class В {

int j; 1 .!:tJ.. , . .

piiblic: . . I >

В {int a) { j = a; } .



Базовый

Производный!

Базовый

Производный2

ПроизводиыйЗ

Здесь базовый класс Базовый наследуется производными классами Производный! и Производный2. Производный класс ПроизводиыйЗ прямо наследует производные классы одныШи одный2. Однако это подразумевает, что класс Базовый фактически наследуется классом ПроизводныйЗ дважды - первый раз через класс юводный!, а второй через класс Производный!. Однако, если член класса Базовый будет использоваться в классе водныйЗ, это вызовет неоднозначность. Поскольку в классе ПроизводныйЗ имеется две копии класса Базовый, то будет ли ссылка на элемент класса Базовый относиться к классу Базовый, наследуемому через класс или к классу Базовый, наследуемому через класс

водный2? Для преодоления этой неоднозначности в C++ включен механизм, благодаря которому в классе ПроизводныйЗ будет включена только одна копия класса Базовый. Класс, поддерживающий этот механизм, называется виртуальным базовым классом (virtual base class).

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

: Т1римеры

\, в этом примере для предотвращения появления в классе derived? двух копий класса base используется виртуальный базовый класс.

В этой програе используется а.пьнь1]й базов класс:

ttinclude <iostream>

using namespace Std; . -i. i:---



1 ... 71 72 73 [ 74 ] 75 76 77 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика