|
Программирование >> Расширенная версия языка c++
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:---
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |