|
Программирование >> Программирование на языке c++
......................... }; class window w scroll { public: int return h thumb position(void); возвращает позицию курсора квадратной формы в горизонтальном окне скроллинга int return v thumb position{void); возвращает позицию курсора квадратной формы в вертикальном окне скроллинга ......................... }; class window w caption and scroll : public window w caption, public window w scroll { public: ......................... }; void main(void) { window w caption and scroll my win; my win.draw caption( Moe окно ); вызов функции первого базового класса cout my win.return v thumb position() \n ; вызов функции второго базового класса Как и раньше, указатель на объект производного класса можно передать в функцию, прототип которой объявляет (в качестве аргумента) указатель на объект любого базового класса, например: void f 1(window w caption*); void f2(window w scroll*); void main(void) { window w caption and scroll* pointer to derived; f 1 (pointer to derived); f2(pointer to derived); Объявления виртуальных функций в базовых и производном классах осуществляются, как и раньще: class window w caption { public: virtual void hide caption(void); .................... }; class window w scroll { public: virtual void set default thumb position(void); ......................... }; class window w caption and scroll : public window w caption, public window w scroll { public: void hide caption(void); void set default thumb position(void); ......................... }; Поскольку мы имеем возможность объявить несколько базовых классов, то один и тот же базовый класс может встретиться дважды для одного и того же производного класса. Например, оба класса: window w caption и window w scroll могут быть производными классами одного и того же базового класса window (окно). Действительно, окно с заголовком и окно со скроллингом являются разновидностями окна. Тогда можно сделать следующие объявления: class window w caption : public window { ..................................}; class window w scroll : public window { ..................................}; class window w caption and scroll : public window w caption, public window w scroll { ..................................}; В ЭТОМ случае класс window w caption and scroll имеет по цепочке два одинаковых базовых класса window (рис. 4.4,а). При необходимости эти одинаковые базовые классы можно объявить как один виртуальный базовый класс, например: class window w caption : virtual public window {...}; class window w scroll : virtual public window {...}; Здесь имеется следующее отличие. Если базовый класс не является виртуальным, то для каждого базового класса с одинаковым именем при описании будет строиться свой объект. Например, если класс wmdow w caption and scroll имеет по цепочке два одинаковых (невиртуальных) базовых класса window, то при описании объекта класса window w caption and scroll будет построено два объекта класса window (см. рис. 4.4,а и пример 1, приведенный ниже). Если же базовый класс (подобно рассмотренному выше классу window) является виртуальным, то будет построен единственный объект этого класса (см. рис. 4.4,6, пример 2 и прил. 2.2). В одно и то же время класс может иметь виртуальный и невиртуальный базовые классы одного типа, например: class В { . . . }; class В1 : virtual public В { . . . }; class В2 : virtual public В { . . . }; class ВЗ : public В { . . . }; class D : public B1, public B2, public B3 {...}; В этом случае класс D имеет два подобъекта класса В (один, наследуемый через класс ВЗ, и другой, являющийся общим для классов В1, В2 и наследуемый через эти классы). Рассмотрим примеры. Пример 1 демонстрирует использование множественного наследования, где В<-В1, В<-В2, Bl<-D, B2<-D. В результате класс D является производным от двух базовых классов Bin В2. Здесь следует обратить внимание на то, что при конструировании объекта класса D строятся два подобъекта класса В. Чтобы построить лишь один подобъект класса В, необходимо объявить класс В виртуальным (это показано в примере 2). #include <iostream.h> class В { public:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |