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

1 ... 49 50 51 [ 52 ] 53 54 55 ... 159


......................... };

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:



1 ... 49 50 51 [ 52 ] 53 54 55 ... 159

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