Point Tn, Tk;        // начало и конец линии 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Point Tn, Tk;        // начало и конец линии



public:

void draw(void)      // метод рисования линии

{

....

line(Tn.getx(), Tn.gety(), Tk.getx(), Tk.gety());

}

void setline(int ncolor) {....}

};

};

 

 

Пример 2

int x;

   int y;

   class enclose {

   public:

    int x;

    static int s;

    class inner {

       void f(int i)

       {

         x = i; // ошибка: присваивание enclose::x

         s = i; // нормально: присваивание enclose::s

        ::x = i; // нормально: присваивание глобальному x

         y = i; // нормально: присваивание глобальному y

       }

       void g(enclose* p, int i)

       {

         p->x = i; // нормально: присваивание enclose::x

       }

     };

   };

   inner* p = 0; // ошибка: `inner' вне области видимости


Глава 6. Наследование

Наследование

Наследование позволяет строить иерархии, в которых производные классы получают элементы родительского (родительских) или базового классов и могут дополнять или изменять его свойства. Классы, находящиеся ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих классов. По мере продвижения вниз иерархии, классы приобретают все более индивидуальные черты. Множественное наследование позволяет одному классу обладать свойствами многих родительских. Причем любой класс может быть объявлен потомком ранее описанного класса.

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

· в первую очередь компилятор устанавливает тип объекта

· ищет метод в классе объекта, если находит, то подключает его

· если метод в классе объекта не найден, то идет поиск в классе родителя. В случае успеха вызывается метод класса родителя. Если метод в классе родителя не найден, то поиск продолжается в классе предков до тех пор, пока метод не будет найден

· если метод не найден, выдается ошибка

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

Ключи доступа при наследовании

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

Пример 1

class name:[private|protected|public] parent_class;

class A{...};

class B{...};

class C{...};

class D:A, protected B, public C {...};


Ключ доступа Спецификатор в базовом классе Спецификатор в производном классе
private private no
  protected private
  public private
protected private no
  protected protected
  public protected
public private no
  protected protected
  public public

 

Private элементы базового класса в производном классе недоступны в производном классе независимо от ключа доступа. Обращение к ним может осуществляться только через элементы базового класса.

Protected элементы с ключом private становятся private, в остальных случаях права доступа к ним не изменяются. Если базовый класс наследуется с ключом private, можно выборочно сделать некоторые элементы доступными в производном классе. Для этого их необходимо объявить в секции public производного класса с помощью оператора доступа к области видимости (::).

Пример 2

Class base

{

...

public: void f();

};

Class derived:private base

{

...

public: base::void f();

};

Для различных методов класса при использовании механизма наследования существуют разные правила наследования. Конструкторы и операторы присваивания в производном классе не наследуются. Операторы инкрементации и декрементации – наследуются.

Пример 3

Пример простого наследования

 

Class queue

{

protected:

int q[10];

int sloc, rloc;

public:

void init(void);

void qput(init i);

int qget(void);

};

Class queue1:public queue

{

int sum;

public:

int get_sum(void);

void show _sum (void);

};

/* копирование функций-членов класса queue */

voi queue::init(void)

{

rloc=sloc=0;

}

int queue::qget(void)

{

if(sloac==rloc)

{

cout << "очередь пуста";

return 0; /* необходимо вернуть какое-либо значение */

}

return q[rloc++];

}

Void queue::qput(int i)

{

if (sloc ==10)

{

cout << "очередь заполнена";

return;

}

q [sloc ++]=i;

}

/* Описание функций - членов класса queue 1*/

int queue1::get_sum(void)

{

sum=0;

for(int i = rloc; i<sloc; i++)

sum+=q[i];

return sum;

}

void queue1::show_sum(void)

{

cout <<"Сумма очереди - "<<sum <<endl;

}

main(void)

{

queue1 obj;

obj.init();

for(int i=0; i<5; i++)

{

obj.qput(100+i);

obj.get_sum();

obj.show_sum();

}

for(i=0; i<6; i++)

{

obj.get_sum();

obj.show_sum();

obj.qget();

}

return 0;

}

 

 


 



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 65; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.242.165 (0.012 с.)